Instant Family

Last week I finally got around to seeing Instant Family.

If you’re not familiar with the movie, it follows a childless couple who decide to adopt out of foster care. As expected, crazy hijinks ensue.

I have to say that I enjoyed the movie quite a bit. It has a lot of humor, while still (pretty) accurately representing what it’s like to be a foster parent.

One thing to be aware of is that this movie is definitely from the foster parent perspective; it’s about how the foster parents fight through the process and (of course) come to learn that their kids are what was missing from their lives. If it was written from the foster child perspective it would be a very different (and probably much less funny) movie. From the perspective of the parents, their lives are being turned upside down because they now have three kids with behaviors that they aren’t prepared for and can’t control. From the perspective of the kids, their lives are turned upside down because they’ve been moved to a new home and don’t know what’s going to happen to them; almost everything in their lives is outside of their control.

I don’t know if I would show this movie to (especially younger) foster kids – as I said, it’s not aimed at them and could be upsetting – but for people considering adoption from the foster care system, or just enjoy a good movie, I highly recommend it.

On Writing

I’ve been working on a technical book for several years now.

Partially, this is because I have a million things to do (coincidentally, my son just turned two). Partially this is because I’m a slow writer. And partially…it’s because writing is hard! Here are a few things to improve the process:

  • Don’t write technical material in Word. Seriously, just don’t. Fortunately I learned this one many years ago – I used to type up my homework for my Algorithms class (due to my lousy handwriting) and it didn’t want long to determine that the effort to figure out LaTeX was less than the effort to get mathy things to work correctly in Word.
  • Once you’ve written something, leave it along for a while and then print it out to proofread it. It’s amazing how many typos you can find once you’re looking at something in a different format and state of mind and can read what you wrote rather than what you meant to write.
  • If at all possible, have somebody else read your work. Sentences that make complete sense to you might not work for someone else. If possible, get a reader who belongs to your target audience and can confirm that you’re not assuming background knowledge or ability that your readers won’t have.
  • Don’t assume you know what your readers want. In my case, I was expecting to write a 400-page book; I was told by multiple people that I should break it up into multiple shorter volumes. Bonus: the first one will be ready a lot sooner!
  • Don’t assume you have to make every change your beta reader suggests. Take their suggestions seriously, but remember, it’s your book – you’re in charge!

You don’t have to be the world’s top expert on something to write a book about it; you just need to have something to say or a way to say it that’s different from what’s been done before. In my case, I have a PhD in computer science and experience as a teacher, a textbook editor, a writer, and a software developer – so writing a book about computer science for software developers seemed like a good way to combine all of those elements. What does your background make you uniquely suited to do?

Thoughts on foster care

I recently gave an “intro to foster care” presentation. What was interesting is that I was trying to both encourage people to consider becoming foster parents, and discourage them from doing so.

Why both? There’s always a shortage of good foster parents – people who really care about the kids and are willing to do whatever it takes to make sure the kids feel safe and have their needs met. At the same time, there are too many foster parents who don’t treat foster kids right. It’s not that they’re necessarily abusing kids, but they’re not willing to put in the effort to become trauma-informed or don’t treat the kids like they’re really members of the family. So I’m trying to increase the number of available foster parents, but only those who are reasonably confident that they can treat foster kids as their own. I emphasize this a lot in my talk – while you have the kids, they’re your kids and deserve to be treated like your kids. If you wouldn’t leave your biological kids out of something, you shouldn’t leave your foster kids out either.

We recently re-opened our home for new placements (we closed after our daughter went home to ensure that we’d be available to support her and her mom as needed), but we’re being pretty selective in who we take because we need to find a kid that we’re the right family for – someone whose needs we can do a good job meeting. It’s not enough to find homes for these kids; they need to be homes where they can be comfortable, where they can feel supported, where they can belong.

Everybody needs a family – whether that be biological relatives, close friends, or otherwise. Are you in a position to be family for someone who needs it?

Being Matt

When I first started working as a developer over seven years ago, it was a bit overwhelming. Not only had I never worked as a programmer or used any of the languages I’d now need, I also had to get used to a lot of internal tools and processes that often had minimal documentation. It was, in a word, exhausting.

Matt was another developer on the team who had already been with the company for half a year, and he was really good at his job. He wasn’t officially my mentor, but he encouraged me to ask questions. I had him as my code reviewer for my first major piece of development, and let’s just say he had a LOT of comments – everything from functional improvements to changes in variable names. It was frustrating, to say the least – but also educational. Having Matt review my code was a great way to learn what good code should look like, and as time went on I would actively seek to have him as my code reviewer whenever I was working on something particularly complicated; having Matt look at my code gave me more confidence that everything was correct.

Matt recently passed away from cancer; one of my regrets is that I never got to know him socially. We had several shared interests, but I just haven’t made a practice of socializing with my coworkers outside of work. However, his passing leaves me as the senior developer on my team; out of thirteen people I’ve been on the team longest (although one person has been at the company longer) and I’ve been on the team at least 2 1/2 years longer than anyone else who is focused entirely on development (rather than being a team lead). This puts me in the position of often being the person that other developers come to with questions.

I’ve never forgotten how Matt encouraged me to ask questions and assured me that the feeling of being overwhelmed was normal (if I recall correctly, he said it took him about a year to really get settled in). I’m trying to do the same for the newer developers (although, since I’m hard of hearing, I encourage people to email me as it’s more of a challenge when they drop by my office).

No matter how good of a developer you are, there’s a limit to how much code you can produce (although Matt produced quite a lot). By helping your team to work better, though, you can have an effect on far more code than you can personally touch. I like to think that my efforts lead to improved code quality even on parts of the codebase that I never touch myself.

Thanks, Matt. Wish you were (still) here.

Introduction to Foster Care

I’m going to go a little off-topic for this blog today and talk about something that’s not technology related but is important to me: foster care. My wife and I have been certified foster parents for several years now, and I find that there are a number of common misconceptions about what foster care is and how it works.

What is foster care?
Foster care is a way to provide homes and families for children who, for whatever reason, do not have parents who are able to care for them. Sometimes that means no living parents or parents who are currently unable to care for children; other times, this is children who have been removed from their homes due to abuse or neglect.

Generally foster care is intended to be a short term solution until the children can be reunited with family members – if not their parents, then other relatives who would be willing to adopt. The actual length of “short term” may vary – children may be in the foster care system for days or years.

There are approximately 400,000 children in foster care in the United States, including nearly 7,000 in Wisconsin.

Who can be a foster parent?
To be a foster parent, you must be at least 21 years old, have sufficient income to cover your own needs, have sufficient room in your home for a child, complete the training requirements, and pass a criminal background check. Most importantly, you should be prepared to love a foster child as your own!

Many people believe they couldn’t do foster care because they wouldn’t be able to love a child and then give them up again, and in fact the primary goal of foster care is reunification – returning a child to their family. I won’t lie – giving up your child is one of the hardest things you’ll ever do, if not the hardest. But by loving them anyway, you can make their lives so much better.

What does it cost to foster / Do foster parents get paid?
Being a foster parent is a volunteer job; like having biological kids, it’s one of the most frustrating and most rewarding things you’ll ever do. The government does provide a (nontaxable) stipend to help cover the costs of caring for the child; in Wisconsin, this rate is $238/month for level 1 care (generally, caring for a relative) and ranges from $394-$511/month depending on the age of the child otherwise. There is an additional rate for children with special needs; at the higher end, a child who needs around-the-clock care may qualify for a total stipend of up to $2000.

Online, I’ve seen comments both from people who think foster parents shouldn’t be paid at all (in which case there would be even more of a shortage, as many of us couldn’t afford it) to those who think foster parents are just in it for the money (that extravagant $13/day to cover the cost of caring for a baby!) It probably comes through here that I think both views are ridiculous; as a friend of mine put it, sometimes the foster care stipend only covers your gas for driving your kid around – but it helps!

Foster kids are covered by Medicaid, and those under 5 are also eligible for WIC benefits. The income of the foster parent does not matter for Medicaid/WIC eligibility.

Who are the kids?
There is a wide variety of children in foster care – from newborns to high school graduates, from kids with no health problems to those who are extremely medically fragile, from single kids to large sibling groups, from those with a plan for reunification to those who will need an adoptive home. Generally speaking, you can assume that the kids have suffered through some level of trauma – if nothing else, that of being removed from their parents. They all need parents who can be patient with them as they deal with change and uncertainty.

How can you get involved?
Not everyone is suited to be a foster parent – it can be physically and mentally exhausting and you do have to have a suitable home. For those who can’t take on a child full-time, other options to help include providing respite care (where you care for a child for a few days or even just a few hours) or even just helping new foster parents with meals when they’re feeling a bit overwhelmed. Most importantly, realize that foster kids aren’t any “less” or “real” than biological children; I love both my biological child and my foster child, and they’re both my kids.

That Conference Follow-Up

We’ve finished anotherĀ That Conference! This was my third year attending, but my first time as a speaker.

As much as I love the name (I’m going to That Conference next week. Which conference? That conference!) and the location (who doesn’t want to spend the better part of a week at a water park?), as much as I love the opportunity to spend three days focused on learning…I think what I get most out of That Conference is an opportunity to recharge. To recover from burnout. To get excited about programming again.

One thing I’ve struggled with is the “hallway track”; I know that many people go to conferences specifically to talk to other developers (often at the cost of even going to the talks!) – That Conference even schedules a half hour break after each session to allow for this – but as someone with a severe hearing loss (and an introvert) I have a very difficult time inserting myself into conversations. This year was easier for two reasons: I met an online friend in person for the first time, and giving a talk provided a ready conversation topic, so I was able to have much more in the way of meaningful interactions than I have in years past.

I’ve uploaded the slides for my accessibility talk; there are a lot of extra details in the presenter notes that I included for reference but didn’t have time to actually work into an hour-long talk. Accessibility is an issue that a lot of people are talking about these days, but that many companies still aren’t taking as seriously as they should; often it’s still an afterthought (or a no-thought). That Conference has been trying to encourage the voices of underrepresented groups (their current goal is to have half of the speakers be women), so I’m hopeful that we’ll also continue to see more work on reaching out to people with disabilities. Last year a number of speakers (including at least one of the keynotes) showed videos without captions, and I wasn’t seeing that this year – I don’t know if that’s just coincidence or if people are keeping accessibility in mind.

I’ll be speaking at MKE.NET in a few weeks, on sorting algorithms, and I definitely plan to be back at That Conference next year.

When to say “I don’t know”

Many years ago, I taught middle school math. One day a student asked me a (non-math related) question that I didn’t know the answer to, so I told her that I didn’t know. She then got annoyed with me because apparently, teachers are supposed to know everything.

I was reminded of this recently when seeing comments about hiring people because they weren’t afraid to admit in an interview that they didn’t know something. Apparently this is somewhat uncommon, which suggests that an awful lot of people are trying to BS their way through interviews.

Of course, nobody wants to hear “I don’t know” to every question, but assuming that you’re qualified for the job you presumably can answer most of them. This applies to working as well; I’d much rather you tell me that you don’t know how to do the task you’re assigned than pretend you already know and get in over your head.

So, here are some acceptable ways to say “I don’t know”:

  • I’m about 80% confident that this is the answer, but I’d have to double check to be sure.
  • I haven’t worked on that functionality, but Jim would know. Let me conference him in.
  • I can’t give a firm deadline for when the project will be completed because we’re waiting on feedback from QA. I’ll follow up with them and see when they expect to be done testing.

Here are some less acceptable ways to do it:

  • I don’t remember. [And I’m too lazy to look it up]
  • I don’t know. [And I can’t be bothered to find out]
  • It was exactly 1,429.3. [Or some other BS answer]

Simply put, if you don’t know something but can find out the answer or direct me to the person better suited to answer the question, that’s just fine. If you are the person who should know the answer, but for some reason you don’t, then you should be finding out; don’t just shrug it off or (worse) make something up. Nobody (well, except apparently some 7th graders) expects you to know everything, but if you’re being lazy or BSing the answer, people won’t be particularly eager to work with you.

tldr: You don’t have to know or remember everything; just be honest.

Computer science in web development?

One of the disadvantages of doing web development (to me, anyway) is that I don’t often get to use my background in theoretical computer science, especially with the front end stuff. It’s much more likely that I’ll be fighting with javascript than calculating asymptotic runtimes!

A few weeks ago was an exception. We had a number of jobs what could be scheduled and needed the software to determine, when a user made a scheduling request, whether that request could cause either the job being scheduled or any job that depended on it to exceed the time allowed. This was a fun little problem that I solved by using a modified depth-first-search to find the longest dependency chain for each job, then using the depths obtained in this preprocessing step to efficiently [O(n+m)] determine which jobs, if any, would end up running past the allotted time so that we could warn the user before allowing the scheduling.

Seven assorted tools and a tape measure.
Tools. Image is in the public domain.

In this case, the problem instance is generally small enough that we could have just brute forced a solutionĀ and it would likely still have had a reasonable runtime, but going with an efficient solution straight off means we don’t have to worry about scaling this up in the future, and the code is just nicer to work with.

You often see knowing the standard algorithms being compared to having more tools in your toolbox, and I think that’s a good comparison. I’m not the super-handyman type, but I still keep a good set of power tools around, and when something around the house needs to be fixed I often have the tools I need to just go ahead and take care of it, and I don’t have to force a tool into a situation it’s not meant for because I don’t have the correct tool available. Similarly, some types of development may not require you to pull out the graph algorithms all that often, but when those situations arrive they’re helpful to have around.

On Writing, Learning, and More

The problem with having a blog is that you have to post new content pretty consistently, or else it becomes just one of the 70 zillion sites on the internet that never gets updated and nobody reads. The question is, how do you always manage to have something to say on a (weekly or better) basis?

This becomes more difficult when it’s a professional blog rather than a personal one. I could certainly write a few posts about my amazing sabbatical in Europe (if you have any interest at all in history and/or castles and have the opportunity to see the Tower of London, DO IT!), my experience as a foster parent, and so on – but on a blog that’s focused on technical issues (specifically, programming and computer science) how many people who aren’t personal friends of mine will care?

Tower of London by Christine Matthews. Used under Creative Commons license.

On the other hand, if I can produce enough content that will be generally relevant to the main topics of the blog, then people can always skip the occasional diversion and come back for the next post. Which brings me back to the original question: how do I manage to consistently deliver content that the majority of readers will find useful? It’s not like I run across and solve an interesting problem every single day.

So I’m going to try a different approach. I’ll continue to do what I’ve been doing – when I have an opinion about a programming topic or just learn something I find interesting, I’ll write it up – but I’m also going to start chronicling things from my personal life that might be of general interest – like, again, what not to miss on a European vacation – even if they’re not strictly technology-related.

Additionally, I’m going to try to formalize my self-improvement program and use the blog to keep it moving. I’ve been in my current developer position for nearly six years now and am at the point where I’m comfortable with it, but even with my current responsibilities I still don’t feel like I’m really an expert developer. I’m always working to improve, but the hassles of day to day life mean that that books pile up unread and that Pluralsight subscription doesn’t get used nearly enough to justify the cost.

So I’m going to set a fairly straightforward goal: at the end of each workday, I’ll try to think of something that I learned or that became more clear to me that day. If I can’t think of anything, then I’ll pull out some type of educational material and go through it until I find something. That something can go on a list, and that list can be topics for blog posts to help me solidify things in my mind.

Maybe that won’t be anything groundbreaking. Maybe it’ll just be a better understanding of how to do something simple in TypeScript. But it seems that by doing this, I can’t help but become just a little bit better every day, and just like compound interest, all those small gains are going to build up over time.

Pretty soon I’m expecting a promotion to senior developer. My goal is to raise my skills to the point where I feel like I deserve it.

Dealing with Spammers: A Modest Proposal

In 2009, it was estimated that spam would cost the world about $130 billion, $42 billion of that in the United States. While technological measures are getting better (for example, Askimet for blog spam), it will always be an arms race between the spammers and the anti-spammers. What can be done?

A significant percentage of email spam is still the Nigerian 419 scam, named after the relevant section of the Nigerian penal code. (The scam actually precedes email; it used to be sent by post!) Everybody’s gotten this one: a rich person died, and concerned people involved need help to get the money out of the country. If you’ll just provide your bank account details and hold the money for them temporarily, they’ll cut you in for a fat percentage.

Since so much spam originates in Nigeria, we have a simple solution: why not transfer ALL spammers to Nigeria? Round up anyone responsible for email or blog spam and give them a one-way ticket to Africa, with a death sentence if they return. Then cut Nigeria off from the internet.

Cruel? Maybe. But isn’t it worth it to eliminate the spam problem once and for all?