Finishing

November has been a crazy month for me. Despite the fact that I’ve been out of the state for eight days this month (and, of course, all the craziness surrounding the holidays) I’ve been doing NaNoWriMo.

In NaNoWriMo, National Novel Writer’s Month, you commit to writing a novel during the month of November, where a novel is defined to be a story consisting of at least 50,000 words. You aren’t allowed to start until 12am on Nov 1 and must finish by 11:59pm on Nov 30. I’ve taken a stab at it twice in the past, but have never actually finished. This year, with five evenings left to work, I’m about 14,000 words away from the goal. I fully intend to reach it.

Why keep doing this? As happened the previous two times that I tried participating, my motivation started off strong and quickly waned. But I kept at it, staying pretty close to the required daily average word count up until my travel started. This week, I’ll have to average close to 3,000 words per day (as compared to the 1,667 required if you’re consistent for the entire 30 days). I’m under no illusions that I’m turning out the Great American Novel. Nor do I expect to sell a million copies; indeed, the smarter move would have been to spend the month continuing to revise my computer science textbook, which I actually do hope will sell quite well. There are certainly ways I could have spent all these hours that would result in a much better return on my investment. So why bother? I gain two things by finishing:

1) I’ll have written a novel! Tons of people want to have written a novel, but actually finishing one is quite a bit less common. It’s another item off the bucket list.

2) I’ll have met the goal. 50k words is challenging, arbitrary, and (for those of us who don’t write full time) pretty difficult to get done in a month. Many days this month I haven’t wanted to write at all – in fact, I’m pretty burned out on it right now – but I force myself to sit down at the computer each day (when I’m sure my wife would rather I come upstairs and watch House of Cards) and bang out the words. NaNoWriMo is a commitment, if only to yourself; once you set a goal, will you keep doing whatever it takes until you reach it? Are you a person who gets things done?

Accessibility at Cream City Code

As promised, here are the slides from my Accessibility talk at Cream City Code. Aside from the links (which, if you saw the talk, are probably why you’re here) there’s a fair amount of extra detail in the presentation notes that I didn’t have time for in the talk.

I saw people taking notes during the talk, which is great – this is stuff we need to be implementing! I’d like to particularly thank those people who actually heard me speak on this topic at That Conference last year and decided it was worth their time to come hear me again.

Accessibility slides

Applying leverage

I was reading a finance thread recently where the concept of leverage came up. Simply put, this is asking what activities get you the best “bang for your buck”.

If you’re a minimum wage worker, then activities that save you money are a good use of time because the return is high compared to your hourly rate. If you’re making eight bucks an hour and can save $2 by spending ten minutes making your own lunch, or $10 by spending an hour sorting through coupons, then those activities essentially pay better than working. On the other hand, if you make six figures, those activities aren’t a good use of time (unless you like making your own lunch). In fact, it’s even financially sensible to pay others to do chores you might not enjoy, such as yard work, if it frees up time that you then apply to higher-paying projects.

This applies at the business level as well. If task X takes a senior developer making $100 2 hours and a junior developer making $50k 3 hours, it makes more sense to assign it to the junior developer even though it will take longer. This has two benefits: the total cost of the task is lower, and it frees up the senior developer to work on projects that require his or her expertise.

At a personal level, this also explains why it makes sense to focus on your strengths. Suppose that on a scale of 1-10, I’m at skill level 1 on skill B and skill level 7 on skill C. I’m most likely going to work primarily on projects involving skill C, since that’s what I’m good at. Unless there’s some reason I really need to use skill B, increasing it to level 2 is less useful than increasing my skill C to level 8, which makes me even more valuable for projects that require skill C. (This is a long-winded way of saying that it’s good to specialize)

Would you rather be good at several things, or great at one thing? Would you rather spend an hour saving $10 or making $50? Where does investing your time return the best results?

Thoughts on That Conference 2018

For the last few years, the beginning of August has meant one thing for me: That Conference! The joke eventually starts getting old, but the conference is always worth the time. 2018 was my fourth year attending and second year speaking.

My favorite talks this year were the first two keynotes. When I saw the title of Jessica Kerr’s talk, “the Origin of Opera and the Future of Programming”, I assumed she meant the web browser. No – she actually meant Opera singing! This isn’t a topic that I have any interest in whatsoever…but Jessica’s enthusiasm actually made it interesting (and yes, she did relate it to programming). Then Cory House gave the keynote I was particularly looking forward to, on building a career; he talked about the tradeoffs he had to make to do what he does. Videos of both talks are available on the That Conference Facebook page.

When I’m writing or speaking, I like to choose a topic that’s more conceptual than language X or program Y. Last year my talks were on accessibility (at That Conference) and sorting algorithms (at MKE.NET); this year my talk at That Conference was about graph theory and I’ll be speaking on accessibility again at Cream City Code. Over the last few years I’ve noticed that there are a lot of software developers who don’t have computer science degrees and are interested in seeing what they’ve missed, which is why I’m giving talks on various topics that would normally be covered in the course of a CS degree (and am writing a book in the area as well). I was happy to see quite a few people turn out to hear what was essentially a math talk and stay engaged to the end. Graph theory isn’t something that most of us will use every day, but it definitely has a lot of practical applications in programming.

If you came to my talk, I appreciate it! See you next year for more waterpark and bacon :-)

Graph Theory slides for That Conference 2018

Setting Priorities

Assuming you get to set your own schedule, how do you choose what to work on next?

Do you pick the most important task? The one with the closest deadline? The one most likely to make your boss (or significant other) happy?

After I read about Kanban, I started trying to arrange my tasks such as to minimize the amount of work that I have in progress. My goal is to minimize the number of things that I am responsible for at any point in time.

Obviously, this doesn’t mean that the highest-priority tasks don’t still get done first – I can’t imagine my team leader would be happy if I told him I was going to put off responding to a critical bug report for a week because I have too many low-priority tasks on my plate – but it means that I’ll try to prioritize finishing something that’s already started over starting something new. This results in less time for tasks overall, because you’re more likely to get back to things while they’re still partially cached in your memory, rather than having to get up to speed again before you can start working. I actually prefer to tackle the tasks that can be knocked off quickly before anything else, and get them through the process and off my plate entirely so they’re not taking up any mental energy.

Plus, it sounds a lot better (at least to me) to say “I finished 5 tasks last week and I’m working on my big project” vs just “I spent last week working on my big project.” Particularly when progress on the larger project is difficult to measure, this shows you’re still getting work done.

Communication in Software Development

At a meetup I was at recently, the speaker asked what we thought were the most important soft skills. My answer was English, or more generally, communication.

Programming can be thought of as communicating with the computer – telling the system what we want it to do – but software development is often just as much about communicating with other people.

  • Before we code, we (sometimes) write a design that lays out exactly what the code should do.
  • When coding, we (hopefully) name our methods and variables, and sometimes even comment, in such a manner as to make it clear to the future reader (whether that be ourselves or another programmer) exactly what’s going on.
  • After the code is complete, we may write testing instructions that should be clear as to exactly what behavior is expected from the code.

These are all areas where many people get sloppy. The design doesn’t really explain what the new expected behavior is, the code is difficult to read, the testing instructions are essentially just “make sure it works.” Often much of this documentation fails to be complete sentences. The result is debate over whether or not the code is working correctly, because the stakeholders don’t have a shared understanding of what “working correctly” looks like.

For the QAer, clarity can be even more important: a bug report is much more useful when it specifies exactly what the problem is, what should be happening, and how to reproduce the issue. Specific, actionable bug reports tend to be acted on; vague notes that don’t explain how to reproduce the problem tend to sit in the bug tracking system for years until they eventually get closed as obsolete (or blow up).

Take the time to communicate clearly; it speeds things up in the long run.

Missing indexes in Oracle

Some little details cause trouble entirely disproportionate to their importance. One such thing is a little quirk in how Oracle handles indexes.

I have some code which gets a list of tables using a particular criteria and then gets all of the indexes associated with those tables. Under normal circumstances, the code works fine. However, when testing in a clean database, it will completely fail to find any of the associated indexes, even though they’ve been verified to exist.

…or have they? It turns out that when the corresponding table does not contain any data, the index may still be associated with the table but it doesn’t really exist. So when you run a query like this:

select * from dba_indexes ind
join dba_segments s
on ind.index_name=s.segment_name
where ind.table_name=’MYTABLE’

It returns no results. Cue confusion. Adding a row to the table causes the index to actually be created and allows my script to start working correctly.

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.

Parsing doubles in Finland

One problem I had this week is that a piece of code which had, for the previous few years, been perfectly behaved suddenly started crashing for a new customer. This was the first time I’d seen the code run on a Finnish system, so a problem with internationalization seemed like the obvious place to start.

Running the software on a fi-fi system, I found that a call to Double.Parse was causing a FormatException: Input string was not in the correct format.

The issue here was that the code was attempting to parse a string which contained a software version number, e.g., “2005.100”. In a US English environment, this works fine – that gets parsed as 2005.1. In a German environment, this works fine – that gets parsed as 2005,100. Finnish, however, doesn’t use the period as either a decimal separator or a thousands separator, so when the system tried to parse the string, it didn’t recognize it as a number.

The solution is to pass in the second parameter for Parse, which (at least in C#) is an IFormatProvider. When no IFormatProvider is given, the system defaults to InstalledUICulture, which means it was trying to interpret the string according to the system’s locale settings. By passing in InvariantCulture, I force it to ignore the locale settings and interpret the input as an English (no country) string.

Double.Parse(version, CultureInfo.InvariantCulture)

As a result, this value – which is always stored in the same format – is also always read in the same format, and the end user sees the same behavior regardless of the computer on which the code is being run.