Monday, July 08, 2019

The Jist

Hey all, happy Sunday!

Tomorrow is my first day working at Google. This has been a dream of mine for a long time and I'm very excited about it. I'm grateful for the support and coaching of my wife. She has taught me how to be brave and pursue the things I want in life. I'm stoked to give this whole thing a shot.

Given that I start tomorrow, and that I have no idea what the intellectual property rules are going to be like, I wanted to vomit out the jist of the software dev book I've been thinking about writing.

I really don't expect it to be good. It's just a rehash of the things I've learned in the first five years of doing this professionally. My desire is that it can stand as a replacement of me to my old team at Xima. It's an opinionated approach to how you should write software. Ready? Let's do this thing.



You suck at programming. And it's not your fault, really. But you suck at it. And you need to understand how you suck at it so you can compensate for your inherent suckiness. One of the core values we're going to try to live by is "Don't Suck".

Why do you suck at programming? There are three reasons.

1. You suck at understanding the rest of your code. 

Your brain can only hold a finite amount of data before it starts losing things. You can think of it as a stack. You can pop stuff on there repeatedly, but you're going to start losing things off the back of it as soon as you pop too much. This is just how you're built. It's not your fault. There's a decent amount of research into this. You can only handle so much cognitive load before things start sucking. Your physical condition affects this too. Less sleep leads to less cognitive capacity. Some people will have less cognitive capacity (smaller stack size) because of a traumatic brain injury or a urinary tract infection. You might be amazing and have a relatively large stack size. But suffice it to say: There exists a program that is too large for you to understand all at once. You don't have enough working memory to keep it all available.

Essentially: You are limited in how much you can understand of your software at one point. You have a moving window of comprehension that precludes you from writing your software well. We're going to refer to this problem as "You suck at understanding the rest of your code". In this usage, "the rest of your code" means all the code that is not currently loaded into your moving window of comprehension.

2. You suck at knowing what the code you wrote does. 

Thought experiment. Indulge me on this one. You're in a high stakes programming situation. There's a beaver dam that will be blown to shreds in five minutes unless you can write a specific method correctly. You know what the input looks like, and you know what the output should look like. You have to read data in from a flat text tile, and write out a new file with the solution in it.

You write code for four minutes straight. This is in your wheelhouse. These are not things you've never done before.

At five minutes it's time to see if you saved the beavers or if they all died and became hats. How confident are you that your dam survived? Based on your normal work history, what is the probability that they aren't hats?

If you're anything like me it's pretty fetching low. Nobody doesn't have this problem. No matter how good we think we are, we always make mistakes. Or maybe we don't make mistakes but our environment is janky. We rarely understand the real details of what we're asking the computer to do for us. We're frequently surprised.

I hope that an inspection of your history will convince you that this is accurate. I have so little confidence in the code that I write. Fun fact: I have even less confidence in the code that you write. The process of translating what we want the computer to do into the language that it understands is incredibly leaky. Even though you wrote the code, you just don't have high certainty about what it does. Really.

3. You suck at knowing what your code should do.

You're going to write software and then it is going to execute. It's going to execute in foreign environments with user-generated input. There is virtually no way that you can predict or test for all of these variables.

That software, assuming it works at all, is going to give users some level of satisfaction. Based on that satisfaction they are going to award you some amount of money. In this scenario, both satisfaction and awarded money might be less than zero. Lol.

How do you maximize satisfaction? How do you minimize disasters based on environmental things you don't control? One solution is to never give your software to users. That provides a very solid lower-bound for satisfaction and requests for refunds. Unfortunately, it also provides a frustratingly immutable upper-bound as well.

Here's the real kicker: You have no idea what your users want. And you have no idea how your software is going to behave when it's in the real world. Will it crash given very specific input? Will it offend your customers? Will it be a smash hit? You're a programmer. Who fetching knows? Not you.

~~~~

So, you suck at writing software. My condolences.

Let's briefly talk about what humanity has learned about overcoming these problems. Please note that we can't completely negate them. They will always be with us. But we can use strategies to make them less painful for us. At the end of the day, you're never going to be a good programmer that doesn't have these weaknesses. You're just going to put practices in place that negate some of their suckiness.

Problem 1 was that you don't understand the rest of your code. There are a few solutions to this.

First: You minimize the cognitive cost of understanding any one unit of code. As you write a new {module, class, method}, you make sure you write it cleanly a la Uncle Bob. Except without the racism. You name things well. You refactor for clarity. In fact, you make clarity the most important freakin' thing about that code. That's all you actually care about. It does the job, and it's incredibly clear. By reducing the cognitive cost you allow yourself and others to fit more code in their brains at once. This leads to fewer window errors.

Second: You leverage abstraction appropriately. You know what abstraction is? Abstraction is "only caring about the parts of something that you really need to care about". Let me give you an example.

Suppose your code uses a Myles. Myles, in the real world, is a person with glasses, hair, and an incredibly diverse array of bacteria in his gut. But representing that in code would be very difficult. What your code cares about is Myles' ability to writeCode().

So your class DevTeam has a Set of Myles in it. But that's just stupid, because your DevTeam does not need to know about Myles' digestive system. So you make Myles implement an interface called CanFetchingWriteCode. And now your DevTeam has a Set of CanFetchingWriteCode. 

You've taken Myles, a very complicated idea, and abstracted it down into what you really care about. Ignore the other parts. They are neat, but not important to your DevTeam.

Third thing here: Write modular code. Reduce coupling. Specifically: Make sure your code in DevTeam knows as little as reasonably possible about your code over in CafeteriaLine. If understanding DevTeam requires understanding CafeteriaLine, your cognitive cost here goes through the roof. Do what you can to decouple them.

~~~~~

Problem 2 is that you don't really know what your code does until it executes. This one is stupidly simple to solve. You just execute your code all the dang time.

Write automated tests that execute the code you just wrote. That's it. That's the whole tweet. Just write tests. Are you thinking about committing some code to the repo? You should execute it first. And the only responsible way to execute it is to wrap a freakin' test around it.

"But Chris, the code I just wrote is resistant to testing!" Well dang, you just wrote code that sucks.

But in a more generous tone; Take whatever "change" that you just made to the existing code and isolate it into something that can be tested. And then test that!

The second solution to this problem is to run your full software frequently. This would likely involve releasing it to customers far more frequently that you're used to.

"But Chris, I can't release this software! It will break something!". You're absolutely right. Your job is to reduce the pain of failure. Here's something that you should really just accept: You're going to break things. I don't care how much QA you have. I don't care how carefully you test. If you're releasing software you are going to freaking break things.

Given that breakages are going to occur, let's just accept that they will happen and let's do what we can to make those breakages less costly. This is called harm reduction. It's the same principle behind needle exchanges, btw. We're going to release our new software to a small percentage of customers first. We're going to have a way to roll customers back to a safe version without a disruption of service. We're going to be able to toggle on and off new features at runtime to get things into a working state.

Can we talk about needle exchanges? The idea is that people are going to do drugs. If they don't have clean needles some percentage of them will use dirty needles and get Hep C or something and cost the state more money. In order to reduce the money the state spends on Hep C, the state sets up a needle exchange booth where people can trade dirty needles for new needles. This reduces the incidence of Hep C and saves money (and lives, maybe). It also creates a safe place for people using drugs to get in contact with people who could offer help. I'm a big proponent of needle exchanges.

There are a lot of less-progressive voices that think needle exchanges are stupid. They dislike the idea of helping anyone do drugs. Offering needles equates to assisting someone in doing drugs, and that feels wrong. We should not be promoting this behavior.

I'ma punch that straw man down, if you'll allow me. The drugs are going to happen either way. That is not something we can stop. Would that we could. But we just can't Nemo. We can accept this truth and try to reduce harm, or we can complain about it and let people get Hep C and then pay for their medical bills. Harm reduction is a cool idea.

We're going to get our software out to the real world as soon as possible and we're going to gather data about how it behaves. We are going to release bad software. But that was going to happen anyways! The key here is to release software that is carefully bad. Specifically: we're going to focus on reducing our mean time to recovery instead of reducing our number of incidents. Releasing 100 bugs and recovering from all of them in 10 seconds each (1000 seconds of downtime) is so much better than releasing exactly one bug with 5000 seconds of downtime.

We're going to stop trying to never release a bug. But we're going to make the cost of bugs much lower.

~~~~

Problem 3 is that you don't know what your code should do. Or, you don't know what the customer wants. Or, you don't know what the market is going to do in three weeks so you might be building the wrong thing anyways.

First solution here is to release frequently. Yeah, you know how frequently you're thinking of releasing? Consider releasing faster than that.

Release and get feedback. Keep your code in an always deployable state.

How do you keep your code in a deployable state? You use trunk based development (aka continuous integration) and you take measures to commit safe code. That means you put risky code behind run-time toggler (look up the article(s) about feature toggles on Martin Fowler's site already...) and you protect your butt with a nice deployment pipeline.

When you're tempted to put your code in a non-deployable state, ask yourself: "Am I willing to throw this code away if priority changes in one week?" If the answer is no, then take measures to maintain releasability.

~~~~

K, that was a fast push through the jist of it. I hope that doesn't suck. Good luck and have fun!

Please hit me up with feedback in the comments section. Thanks.

Wednesday, February 12, 2014

Morning Microwave Burrito

It's 2:05 AM and I'm eating a microwave burrito. I normally eat two of these at once, but I'm trying to be reasonable considering I should have been in bed two hours ago. I was hungry and didn't feel like sleeping. So now I'm eating a delicious burrito and blogging for the first time in 1.5 years.

Lots has changed in 1.5 years.

But this isn't the place to talk about what has changed- this is the place to talk about what's going through my head at two in the morning.

I got "encouraged to apply for a job" today. That means that there is an opening and that someone linked to that opening encouraged me to apply for it. This is always a very flattering experience, and given the respect that I have for the individual who encouraged me to apply, it was pretty cool.

The problem with being a developer about to graduate is that there are lots of viable jobs. You have to pick the one that is best for you. There are tons of factors to this- money, the tech stack, the experience you'll get, the people you'll work with, the potential for career growth, etc.

I already know where I want to end up when I graduate. But the future is a terribly long time, and I'm planning to do this whole software development thing for a long time. I can't just stop thinking about what I want to do when I grow up because I know the first place I want to work when I graduate. I could stay there for ten years and still have a good twenty plus years to work other places and develop other things. I suppose this is a longer way of saying that I want to make good career decisions but feel overwhelmed by that responsibility. I additionally feel a little bit overwhelmed by the need to balance my current financial needs with the chance to go do some original and exciting things. A lower paying job could yield more varied experience. It could also yield eating rice and beans for a few months until I graduate, and I'm really a little too fond of these burritos to accept that kind of fate.

So what do I want to do when I grow up? Well, I really like the idea of having customers. I really like writing software that makes a difference to someone. Not like, the whole meaningful difference you make in someone's life when things get sentimental and blah blah blah, but I do like having an impact. If I make a horribly mangled feature I'd like to have someone get mad at me. The only reason I want that is so people will really really like it when I make something elegant. I like the idea of my code affecting human beings.

I'd really like to do something that had a net positive impact on the world. One of the cool things about software is that you can work in nearly any industry you want. Everybody needs software these days. I'd like to do something that helps people. I'm not sure what that looks like yet, but I want to give it some thought. No Flappy Birds for me; I'd like to make things better.

Recently I've been thinking about growing up to be head of development somewhere. Mostly because I think the last head of development I worked with was such a rockstar. That guy just oozed good leadership. The company he works for is way better off for having him. He makes a big impact on pretty much all the developers who work there, including all the Summer interns they bring in. I think what I like about that human is that he has such a positive impact on the people around him. They write better software because he's in charge. I'd like to be qualified to do something like that one day. I'd like to have the experience and wisdom to be able to take a situation and make it better.

As a sidenote, I totally have a plan to make this work. Once I'm out of school (oh hallelujah) I'm going to hit the gym six times a week. I'll bike for 30 minutes a day (Or, you know, elliptical or jog if I'm feeling it). For those 30 minutes I'll read good books on sofftware development. That way I get awesome exercise and get to experience some pretty good ideas in the field. Sign me up for the two for one combo.

I would really like another burrito right about now.

So what software do you write? What software do people need right now? How do you effect a positive change (and yes, I'm pretty sure that's the correct spelling of effect right now) via some product you create and sell? I mean I could certainly go work for the church, but I'm not really feeling that career path right now. I could work in an educational setting (writing software for educational purposes), and maybe that'd fit the bill. I have trouble profiting off of education though, you know, since I've gotten all of mine for free. I think products that give people information and allows them to make good choices is a pretty good option- mint.com comes to mind. Maybe I can find or create something like that.

I mean, if you're going to spend 40 hours a week working on something, wouldn't you like to work on something that makes the world a better place? If you're going to painstakingly craft a highly specialized tool over the course of a few years, shouldn't that tool be used for good purposes? I understand that money is important (sure do), but I would like to feel good about making money doing something beneficial for everybody else.

I suppose most software isn't evil. Some of it is. I think most is pretty neutral. But I'd prefer brashly positive over neutral.

I don't know what that looks like yet. And I'm not sure what skill set I should really pursue right now to spec myself out to accomplish that. My current plan is a very solid and reliable foundation (hooray for being a Java developer), along with really solid engineering understanding and experience (I'll test my code even if nobody else will). Along the way I'll start building things for me using whatever new and fun technology is around. First up is a bug database with a Jersey backend and Angular front end. Then I'll have to publish a few Android apps this Summer. I have no idea if this is the optimal path for me. I could do more research to figure it out-- but there are about a bajillion unknowns so it's really hard to tell. This certainly isn't something to complain about. If I had a slightly better attitude right now I think that I could really celebrate because of that. Things keep changing, so there's a good chance that things will improve for you. Given a dynamic system, being a real agent that makes real decisions is a really good thing. Since things are constantly changing you constantly have chances to improve your situation. Sure, if you weren't able to make choices it wouldn't do you any good. But being able to choose in such a dynamic system gives you tons of opportunities. Fine, I'll be more cheerful about all this.

I never worried about saying too much online before. I do a little bit more now. I have a little more on the line- employment, a wife to take care of, all that good gravy. In the past it was a piece of cake. One thing that gives me comfort is the vast amount of information one can put out there. I mean, seriously, I don't care how dedicated you are to your job, you'd have to be pretty serious about stalking me to have read this far. And if I post like this every day for a year, there will be crazy amounts of text to read through. You could certainly automate that process, but what's the fun in that?

It's good to write again. I know full well that it is not high quality writing, but it's a pleasure to communicate. Not that there is an official recipient of this message. In fact, there's a high probability that no one will *ever* read it. But it feels good to me. It feels nice to say some things that are on my mind. It's something that I have missed a lot.

Things are good. School is honestly pretty good. I feel like I'm a better student now than I have ever been before. Sometimes I feel like I am not making any progress towards graduation at all, but I know it's coming. I have been way more diligent in my homework and studies than normal this semester. I have some cool classes. I've been loving my extra curricular activities. The ACM is going really well and seems to be making a positive impact in the department. I sure enjoy it. Work is a blast. I haven't had this much fun at work in a really long time. I'm implementing some outstanding feature requests we've had for a while. It feels fantastic to add functionality that wasn't there before. I love knowing that I make someone's tasks a little easier to do. Maybe all this fun of feeling like I contribute meaningfully to the success of the product will wear off one day, but for now I'm having a great time.

The future is pretty dang interesting. I have a few options. It's mildly terrifying to know that I can pick whichever option I want. There's a lot of comfort in that, though. Choosing our path is the way that it's supposed to be. It's really nice to have that luxury of choice right now. I need to cheer up and appreciate that more. Not everybody gets these opportunities.

As a happy reminder, I'm where I am now because of choices that I made in the past. Some of those choices were good, and some of those choices were bad. The important thing to remember is that where I am in a year will be directly influenced by the choices that I make between now and then. What choices will lead to the best outcomes? That depends on what I want those outcomes to be. Without defining a goal it is crazy hard to know which choices to take. Curse you, Cheshire Cat, for teaching us such a timeless truth.

It is sleep time. I would like to publicly congratulate myself on only eating one burrito tonight. Sometimes I eat microwave burritos on a plastic plate using some really fancy silver we inherited because all of our normal civilian forks are dirty. It's a mildly ironic situation- a very easy and unsophisticated meal delivered by the nicest stuff we have in the house. But I guess that's life sometimes. Everything doesn't always match up, but that's okay. You do the best you can and really enjoy the microwave burritos.

Sunday, August 19, 2012

Palindromes

Welcome to the palindrome Q&A post! I hope you enjoy.

Q: What is a palindrome?

A: A palindrome is a sequence of characters that reads the same backwards as it does forwards. Consider the word "racecar". If you read it front-to-back you get the letters r-a-c-e-c-a-r. If you read it backwards you get the letters r-a-c-e-c-a-r. So, "racecar" is a palindrome because it's the same backwards and forwards. You can make palindromes out of numbers, and those are the ones that you'll see most on my Facebook wall. the sequence "13331" is a palindrome. Get the idea?

Q: Why do you keep posting pictures of odometers on your wall?

A: I post pictures of odometers when they are palindromic, or when they read the same forwards as they do backwards. This is a special event in the life of each odometer and I think that it deserves to be recognized. Depending on how many miles your car has, this may or may not happen all that often. It's a fun nerdy hobby. Some people watch birds. Other people watch odometers. 

Q: Where do you get all of these pictures?

A: I posted my first palindromic odometer picture of June 29th, 2012. By August 19th I had received 27 pictures from friends of their own odometers when they achieved palindromicity (note: that's not actually a word..... yet). People from all walks of life have snagged the pictures and sent them in. So far I have received pictures from Utah, Idaho, California, Florida, Texas, Ohio, Montana, Wyoming, and Maryland. Only 41 states to go! I'm not sure why, but everybody seems to love catching their odometer when its a palindrome. I honestly never expected this to catch on. I've been shocked by the number of people that come up to me in the real world and tell me that they're working hard to find me a palindrome. It's a pretty great feeling. 

Q: Okay, I want to play, how do I help?

A: You can help by taking a picture of your odometer the next time that it is palindromic. It should likely happen somewhere in the next 1100 miles. Snag a picture of it when it is palindromic and send me the photo. The easiest way is to send me a facebook message or an email at cjthatcher, you know, at gmail.com. Attach the photo as well as any additional information you want to include. I can't promise it will be posted super quickly-- I have a backlog and I don't want to spam people by posting more than one a day, but I do promise that it will be posted. 

Q: Taking these pictures while driving sounds pretty dangerous...

A: So, you're right. You should definitely do everything you can to be safe while you take this picture. My favorite method is to drive with a buddy and have them take the picture while you drive like a normal human being. If that is not possible, consider pulling off to the side of the road (you know, uh, safely). As much as I love palindromes, I feel like your life is worth more than a cell-phone-camera-quality picture of a cool string of numbers. Please be safe. 

Q: So, uhh, aren't you worried that no one will ever go on a date with you again because you post about number theory on Facebook every night?

A: Yes.

Q: What if I think this is all sort of stupid, can we still be friends?

A: Absolutely! I have great respect for people who thinks palindromes are stupid. 

Leave me a comment if you have any other questions that I haven't covered yet. Much love~

Growing Body of Evidence

I saw this piece of news on a website that I sometimes read. While I choose to take a neutral stance on the issue, I do believe that this evidence is worth taking into consideration when discussing such topics.

There is a growing body of evidence that suggests that dogs (especially puppies) cause cancer and most genocide events. Nine out of ten oncologists agree that you shouldn't let them in your house unless you are slowly trying to kill yourself or those that you love. 

You can see the full article here.

Monday, May 28, 2012

Dating - A Nerd's Perspective


Hi, I'm Chris Thatcher, and I misuse commas. I try to look at dating like I look at math and it doesn't always work. I think I'm a decent guy, and I'm looking for a spectacular girl. This post is a little bit out there for me-- it's not something that I'd be comfortable writing all the time. For whatever reason I have written it tonight, and I feel pretty good about it. My hope is that this post doesn't discourage anyone. I've written down a lot of my feelings towards dating. Most of them are fears, but I promise that this is not all negative. As always, I really appreciate comments and hope that you'll enjoy the post.

Dating-- oh how I would like to do that. One of the less understood things in my life. I will once again echo the refrain that Levi told me. "I know exactly what I want in every single aspect of my life except dating". A lot of questions. Incredibly far reaching consequences.

I have a few general policies here on the blog. One of those policies is  to never complain (coincidentally, another policy is to never split the infinitive of a verb, but you can see how well I'm doing at that...) I may or may not break this policy all the time.  The other policy is to never mention specifics about relationships. It's just bad practice. The good news is that my life is pretty dang free of relationships right now. Since I have virtually no interaction with the opposite gender outside of a few texts a week, there is nobody out there that can read this post and be like "Oh my gosh, I think he's talking about me!" So, because of that, I think I will outline a few of the challenges I feel like I'm facing with dating.

I do not intend for this to be discouraging for anyone. Nor do I intend for it to be complain-y. I do intend for it to be enlightening- mostly for my own benefit. I think that stuff like this has value not because it carries with it any inherent truth or understanding, but because it is indicative of what I perceive as my challenges right now. How am I feeling? A valuable part of understanding a situation is less about what the true circumstances are and more about how people are responding to those true circumstances.

So, what scares me about dating? Dating scares me because I recognize that I can fall in love with someone that's not perfect for me. I know that at the end of the day this is right-- it is functioning as designed. I know that no one will be perfect for me. But what if I pick someone that's like, not-that-great for me? I can fall in love with that person and we can be happy together. But why couldn't I have picked someone that was, you know, great for me? I know I won't find perfect, but I'm always afraid that any choice I make won't be optimal. The good news behind this is that I'm convinced that love is real and is more important than the optimal solution.

I'm scared of getting into a "plan b" relationship and then missing the boat on "plan a". How often does someone come along that you are legitimately interested in? Not just a fleeting, "Hey, I could maybe see myself dating this person..." , but someone that makes you think "I will move Heaven and Earth if only for the chance to date her!" Thoughts like this, though rare, do happen to me. So what do you do when that doesn't work out? What do you do when there's no one that currently inspires you to move mountains? Do you pursue the "I could maybe see myself dating this person"- person? Do you hold out and trust that next time will go better than the last awkward time you called a girl on the phone? What is the appropriate response? Where do you draw the line between waiting for that perfect person and doing the best with what is currently available?

I have decided that you can't quantify people. You cannot assign a numeric value to someone. The Levi inside of me would love that to work out. I can't do it. I don't think anyone can. Nor can you know how things will work out in the future. This was the case a lot on the mission. How am I going to be in two years? How is this person going to be in two years? Well, person Y gets back in X months, do I just hold off till then? Will person Y's value in X months exceed person Z's value right now? See, stuff like that doesn't work out. I think it's a good thing it doesn't work out. I am still a little bummed that my normal approach is useless here.

One important thing- people appreciate over time. That is, they become worth more to me over time. When I've felt like there is no one that currently inspires me to move mountains I have never intend to throw all the wonderful girls around me under the bus. I'm sure that there are people that, given time, would inspire me to move mountains. I just haven't discovered that yet. I feel like I've been blessed with an ability to care about people. I'm so grateful for this. But that care takes time to develop. It's hard to have a superficial understanding of someone and care deeply about them. So how do you develop that care? Do you just pick someone that looks promising and get to know them so you can care about them deeply? Is that the gamble I want to play? Do you do a general approach, get to know everyone, and then gamble from there based on preliminary results? Do you pick the best looking one and hope that works out? Random number generators? Come on now, anything would help.

I appreciate chick flicks and love songs because they make me feel stuff in my heart that I don't get to feel that often. I have friends that classify themselves as romantics. I guess that's not me. But when I watch a good chick flick or listen to great songs that I could have slow-danced to at a region dance, it really makes me want to date someone-- it really makes me want to care deeply about someone and spend the rest of my life helping them be happy. There's a very natural desire and need there that occasionally gets buried in the text books and nerdiness of day to day life. Feelings vary wildly, but I'm grateful for the feelings that kick me in the butt and get me out the door and on a date.

I had a great talk with a great friend the other day. He expressed his fear of making decisions based on fleeting emotions. He basically said that he knew he would face a situation where he would feel a certain way. He knows exactly how he'll feel in three months, but he won't know why he feels that way. Will he want to move mountains for this girl because that's what he truly wants or because he's been out of town forever? Because he won't be able to ascertain why he feels that way he has decided that he will ignore the feeling altogether.

This scares me to death. Yeah, feelings are fleeting-- but I think we have them for a reason. Without them I'm sure we'd all grow up to be excellent and lonely engineers. So that's a question for the books- where do we draw the line between what we think and what we feel? Can we trust our feelings exclusively? Can we trust our mind exclusively? When do we throw one out the window in favor of the other?

So where do I stand? The truth is that I think things are alright. Fear is the opposite of faith, right? So why do I say that things scare me to death if I'm trying to be faithful? Well, I still have my concerns. Heck, I still have my fears. I'm working on this faith thing, but I'm man enough to say that I haven't perfect it yet.

Here's what I think. I think that the answer lies somewhere in the middle. I think that it's absurd to wait forever for the perfect girl. I do not want to be 40 and lonely because I passed by a trillion excellent girls in pursuit of the nonexistent perfect girl. I don't want to pass up excellent people because they did not impress me in the first superficial seven seconds I spent evaluating them. People's true worth will probably never be known, but I know that I certainly can't approximate it in seven seconds. People deserve a chance.

I think that one day I'm going to meet someone that inspires me to move mountains for her. She will impress me on multiple levels and I will be willing to make a fool of myself to get her to notice me. I will make a valiant attempt-- this attempt will likely be entirely ridiculous. Note that so far none of this is new. It has happened multiple times in the past. The new part is that this girl that inspires me to move mountains will also think I'm pretty cool. Someday I will be impressed by someone that is at least partially impressed by me too. I will logically know that this is a good choice, and I'll feel it too. I won't have to throw either heart or mind out the window because both will be on board. When this happens, we will both be available in one way or another. Timing has historically been my enemy, but when things work out, well shoot, they will work out.

When things work out, I won't feel like I'm playing on insane difficulty when it comes to the relationship. When things work out, they will work. All these questions without answers will stop being such a big deal because we'll both feel that this is working out. We'll both be able to see it working out. We'll wonder why we thought it was so terribly difficult in the first place-- we didn't have to spend forever and a day agonizing over every unanswered question, we just had to find each other.

(oh gag me-- I sound so sappy)

So, somewhere, someday, this is going to work out. Of that I am confident. Until then, well, I'll do the best I can I guess. But I'm sure there's a solution out there for me. And my favorite part of all that is knowing that whoever my solution is, I get to be her solution. Because after all, this is a two way street. I'm searching, sure, but she's gotta be searching too, right? I mean, me trying to find a needle in a haystack isn't the world's easiest thing, but if that needle is trying to find me, well boy howdy, it should go at least twice as fast that way, right?

Dating is complicated. It's not math, and because it's not math it's a little bit over my head sometimes. There's a huge part of me that just wishes I could text girls and ask them out. Society indicates that that's not okay, and fine, I'll play by your rules. At the end of the day I often feel like I'm not cut out for all of this. But hey, that's the way the game is right now. I trust that one day I will find a solution, and because of that I am willing to play the game.

Hmm, it has been good to write tonight. Dating can often be discouraging, but I don't feel so discouraged right now. We work and do the best we can, and one day things work out. Sign me up for that.

Writing to Reach You II

There is a song by Travis titled "Writing to Reach You". I don't particularly like the song and I'm not writing this post to 'reach' anyone. It is, however, an awesome title. So I'm using it.

Tonight I feel a little off, and since tomorrow is a holiday and I don't have work, I'm doing something I haven't done for years. I'm listening to Ryan Shupe and the Rubberband -- Dream Big and writing a blog post. This used to be the song I'd listen to whenever I'd make plans for the future. It's a good song.

Life is different for me than it has ever been before. I've never quite been where I am right now. It has its ups and downs. The ups are pretty excellent. My job is absolutely perfect for me. I couldn't possibly ask for anything better. I have been incredibly blessed in this one. I'm learning a lot. Things are going very well at the singles' ward down here. I have a calling that I love and things are moving forward there. I'm living at home and I'm able to spend all day long with my family. I spend the work day with a few of my brothers and then get to see the rest of my family almost every evening. Things are great.

My social life, unfortunately, is quite dead. That's something that I would like to fix. I really loved the way things were going in Logan right before semester ended. I was super comfortable in my environment. I knew nearly everyone around me and we were able to do fun stuff pretty often. I miss that. My social circle right now is my immediate family. I love my family, but I know that I need to get out there and build a social life. No matter how antisocial I pretend to be, I know that I need that social interaction in order to be a happy person. I'm totally grumpy when I don't get out.

As last semester drew to a close I vowed that I would make this the best summer ever. In order to accomplish this I had some specific goals and initiatives set up. I haven't gotten there yet. A few things I was hoping for fell through. Things aren't as feasible as I once hoped they would be. I have some adjustments that I need to make. I will say that so far this summer has not been the best summer ever. The good news is that it is yet young. I recognize that it's going to come down to my choices. I can make choices that will make this the best summer ever. What those choices are, well, I don't quite know yet.

It has been said that life is simultaneously full of scarcity and surplus. I have so much time for family and economic progress right now it's insane. I have good opportunity to really serve and make a difference in this sphere. I have no car, no social life, and no time for naps when I need them. Things have never quite been like this before.

You know, it seems it always takes me a little while to get comfortable and confident in a new situation. I show up to a new place and have some rough days to start. It always makes me wonder-- I'm not particularly used to or fond of rough days. I wonder what I am doing that leads to discouragement or lack of success. Over time, though, things start to get better.

There's a lot to be said about experience. There's a lot to be said about making a mistake and then knowing how to avoid that mistake next time. There's something to be said about knowing and caring about the people around you. These are things that come with time. It's a little foolish to assume that I can walk into a situation and immediately excel. It's not surprising that things start out rough.

I've been learning this with work. There is so much you can learn about principles, but at the end of the day you need to be familiar with the with which you are working. Principles can help you get familiar a little faster, but when push comes to shove it's going to take you time to figure things out. Once you have them figured out, however, you can become pretty powerful. This is one reason that I love my job so much. For the first time in my life I'm getting real experience in something that I plan to work in for the rest of my life. This is huge.

Life is good. Life is simultaneously difficult. That's the way things are, and I think that that is by design. I don't know precisely what decisions I need to make in order to improve my situation, but I would like to start moving in that direction. Things are on the up and up. We're going to get there, you know.

Saturday, April 28, 2012

Four Minutes to Remember How Small We Are



Sorry the sizing doesn't quite work out. So, you may have asked yourself "What would I do if I were stuck on the International Space Station for weeks at a time?" The answer, apparently, is make wicked sick time lapse videos in order to remind us of our own mortality. Four minutes-- probably worth your time. Give it a look.

Friday, April 20, 2012

Live Blog From CSII

12:33 PM- Hey, this is Chris Thatcher here, live blogging my own attempt to stay awake through a whole class of CS1410. I have fallen asleep in class each of the last six times I have attended. My goal for today is to stay awake for the entire 50 minutes of class. I have come to the conclusion that taking notes during class doesn't quite do it for me. I am therefore live-blogging this event. Wish my luck.

12:34 PM- Looking at binary trees. Now we're talking about typedef- this is important, I should pay attention. Hmm, typedef

so, typedef Node* Nodeptr; // This means that we can use Nodeptr to refer to Node*. So, more convenient I suppose.

12:37 PM- I gave myself a haircut last night. I think it turned out alright, but not great. It's a lot easier to cut someone else's hair than it is to cut your own. It's pretty apparent that I didn't get everything even. I think I'll probably fix it up tonight. Question: What's the difference between a good haircut and a bad haircut? Answer: about a week and a half. Well then, friends, I'll see you in about a week and a half.

12:39 PM- Our assignment for this week is to make a learning binary tree. I don't feel like it should be too difficult- chances are I'll need lots more time than I anticipate. It always happens like that. It's basically a linked list, just a tiny bit more complicated. I think I can make this work.

12:40 PM- Quick laptop check around the room performed by yours truly: Girl to my left was just on canvas checking her calendar. Guy in front of her is checking Google+ (he's not a Facebook man, apparently). Guy to my right is coding in some IDE I don't recognize. Distance operator is on Facebook. Guy on far left is in Visual Studio taking notes, good for him. I'm in the newly redesigned Blogger typing a post. I will say that I highly dislike Google's new trend of using buttons without text. I love to hit the button that says "New Post". I despise having to mouse over three different buttons to see the tooltips before I know which new textless button means new post. I just see no advantage to using textless buttons. How many illiterate people are going to be writing new blog posts? Are we really trying to cater to the illiterate blogging population by making the interface more accessible to them? As I wrote that, I realized that this might make life easier for translation- if you offer this service to users in Spanish as well, you no longer have to translate your button's text. Only issue? Still need to translate the tooltip, so no real gain made. I don't like how gmail now uses images instead of text for buttons. I'm a text man, dangit. I didn't learn to read for nothing.

12:45 PM - Professor just mentioned that what he had just written on the board would be on the final exam. I failed to copy it down before it got erased. Alas.

12:46 - I decided to stop typing and pay more attention for a bit. That led to me getting drowsy. Yeah, that took all of 1.5 minutes to happen. Could be a long class period. You know, it's not that I don't love this class, because I really do. I love CS. I think the problems we are solving right now are awesome. I really like this professor's teaching style. So it's not boredom- it's just plain out sleepiness.

12:49 - Okay, the professor is pretty much coding the whole assignment for me. So I'll take some quick notes

I wrote some code here, but didn't really want that showing up in search results. It is now in a text file where I take normal class notes.

Now we're using a binary tree to do some binary searching. Coolish. Mmm, I want to go to Betos.

12:51 PM - Now he's mentioning stuff that we learned last time. I must have been entirely asleep for that part. My bad. Thank goodness for good books that cover the same material.

12:57 PM - I am a huge proponent of mice over trackpads. I do not love trackpads. My speed is greatly reduced when I'm restricted to the track pad. I see *tons* of people using the trackpad as their primary device on campus- even when they're at a place where it would make sense to use a mouse. I see roommates do it in the apartment. I'm grateful that trackpads exist. I'd choose a mouse with bad breath over a trackpad with a 10 dollar bill any day.

1:02 PM - There's a couple in this class that always cuddles during lecture time. I'm glad that's not me. Not because that wouldn't be fun, but because I don't think I would learn anything-- I'd be far too distracted. Not sure how they do it. They both appear to be doing well in the course. Then again, I sleep through lecture and am doing alright in the course, so to each his own and all that.

1:05 PM - Update: the kid who was checking Google+ earlier is now checking Facebook. I guess he's dual wielding his social networks. I wonder which one he prefers. I could spend the rest of the semester taking careful data on how much time he spends on each one during class, but that doesn't sound like much fun. I'd probably fall asleep before I got any good data.

1:07 PM - Today is definitely a fast food after class kind of day. I wonder if I will find someone to go with me or if I will go eat by myself. People are always very friendly when you go get a burger by yourself. I think they assume that you are trying to drown your loneliness in food. It's not so much about being lonely as it is about eating delicious food. Toss up between Carl's Jr. and El Sol right now. Learning towards Carl's, just because it feels more like a Carl's day than an El Sol day.

1:10 PM - I'm quite glad I'm staying awake today. I'm learning a lot.

1:13 PM - Note to self, I will certainly need extra time to debug this assignment when I get to writing it. Don't let me procrastinate starting it, okay? Thanks.

1:14 PM - Great news! Only six more minutes and then I will have stayed awake during the whole class. w00t!

1:19 PM - I made it! Score! Now I'm off to do some grading. Everybody loves grading! Thanks for sticking around for the live blog. Much love y'all, have a great Friday.

1:25 PM - Upstairs now, but the office I'm supposed to occupy (#OccupyTheGraderOffice) isn't available for another five minutes. You, my loyal readers, are therefore awarded two free rambling thoughts.

#1 -> It's tradition on campus to wear your game day Tshirt to school on Friday. I think it stems from the fact that we have football games on Fridays. It's not at all uncommon to see people running around in their navy blue shirts on a day like today. Since it is nearly laundry day, I too am wearing the game day shirt. I am always tempted to be totally obnoxious on days like today. Whenever I see a girl wearing her gameday shirt I want to go up to her and make a big old deal about the fact that we are wearing matching shirts. "Oh my gosh, we're matching! That's so incredible! I can't believe this! What are the odds? Wow, how did you decide to wear this shirt today? That's so weird- it must be destiny". Yeah, I've never actually done that, but I imagine it'd be a good time. Put that one on the list of "stupid things I feel like doing but hopefully won't ever do"

#2 -> There's something fun going on outside on the quad today. I'm not sure what it is. I probably won't visit. But it looks fun. I bet I could score some free food if I went. Hmmm. I may just change my mind. We'll see.

Well, it looks like I can go make my political protest in the grader office now. I'm not sure what I'm demanding, but I'm pretty sure that will just help me fit in with the rest of the disgruntled crowd. Word.


Sunday, April 15, 2012

My Week as an English Major

April 15, 2012. Last night I stayed up all night programming for Google Code Jam. It was the qualifying round, and you needed 20 points out of 100 to move on to the next round (okay, so the bar was set low). I scored 45/100, and my buddy Dallin got 60/100.

I recognize that the chances of me getting out of the next round alive are slim-to-nill. I'm not competing in this contest to win- I'm competing in it to learn and grow as a person. I want to be an excellent programmer, but I know I'm still a total noob. The way to get better, I figure, is to consistently work on it. So that's what I'm trying to do- throw myself up against problems that need to be solved so that I can get better at solving them. The problems I solved last night were trivial, and it took me an embarrassingly long amount of time to solve them. But the truth is, that's okay with me. You better believe I'm going to do much better next year. And that's why I do these things, because I know that my actions today are going to affect my abilities tomorrow. I'm super stoked that I live in a world where I am able to pursue my dreams like this. The great news is that there are resources available. If you want to get better at something, chances are you can find a way to do it. I like having things to work on.

I watched Much Ado About Nothing yesterday with a great neighbor of mine. I had completely forgotten how awesome William Shakespeare was. That guy had serious moves. He was a true master of his craft. It was awesome to see a good play put on by very good actors. Sure, there are flaws to it, but it was a great moment for me. For some reason I had forgotten that the world wasn't made up entirely of amateurs. We get so very used to the mediocre. Yesterday it was great to see (arguably) the best playwright ever's work put on by (pretty great) actors that got paid a whole lot. I loved his writing. It reminded me how much I love English in general. I am not an English major, but I feel like there's a portion of me that would like to be. I remember how much I wrote in the past and how much I loved doing it. I remember how much I loved reading and analyzing. There's a huge part of me that just loves that stuff, but I don't get to express that part too often. It was good to let the English major inside of me out for a while.

I haven't had much homework this week. It has led to more free time, more social interaction, and in general a wider-range of thought and consideration. My thoughts and energy haven't been funneled entirely into homework of only one variety. In a way it feels like a historical trip to the past. Back in the blessed days of high school we learned about so many things at once. All of public schooling was designed to teach us a wide variety of important things. In college we're allowed to specialize. But just because I'm not studying History or English or Choir anymore doesn't mean that I don't love them and want them to be part of my life. Let's be completely honest, I read an article in the Atlantic and Kayne West and Jay-Z two nights ago just because I wanted some more variety.

I don't say this in any way to indicate that I am dissatisfied with my studies- I am super happy with my studies right now. All I'm saying is that we as people are so much more than what we study. We are so much more than what we choose to do for work. I can't let that define me. Being good at math doesn't mean I'm a poetic retard. Being a decent programmer doesn't make me socially inept or incapable of dominating a public speaking assignment. I suppose that I had gotten into that mindset earlier. It's nice to be out of it.

So, here I am, with three weeks left in the semester: loving life. I'm not sure how these three weeks will turn out. I'm sure the relative calm of this week will be replaced by the tornadoes of bookstore work, grading, assignments, tests, and the horrific experience that is moving out of an apartment and passing cleaning checks. There will be academic-all-nighters (Year to date: 3), a few dates (oh I sure hope so), the freedom and splurging that comes at the end of finals. I'm sure it'll be a good experience.

It's strange to confront such a finite range of time and recognize how important it is. Three weeks, that's all. Understanding that the people with which I've been in close proximity for nearly 8 months will all be gone in three weeks means that if ever there was a time to try to make friends, it is now. Procrastinating this one for more than 21 days will likely mean that the opportunity is gone. Academically speaking, despite the hard work we've all put in over the past 11-ish weeks, we could toss it all away if we stopped trying right now. So many things will change over these next three weeks. The really strange thing for me is that I know there will come a time when I will look back on those three weeks and know exactly how they went. I'll know which games the Utah Jazz won and which games they lost. I'll know which games our Ultimate team has won and lost-- I will likely know the contributing factors to the outcomes of those games. I will know what my final Java project ended up being, and I'll know exactly what was on the final in CS 1410. Right now all of those things are unknowns. Knowing them would certainly help right now.

I guess what I mean to say is that the future isn't written and that my decisions are going to change things forever. As terrifying as that is, I know that that's how things have been going since the beginning. Who will I choose to be for the next 21 days? Surely my decisions will impact the kind of person I am at the end of these three weeks. Who will I talk with? In what will I spend my time? It's all in the air. With what are clearly unclear consequences for every action, I am chronically stepping into the future and shaping my destiny as I go.

Is this terrifying? I'm not sure yet. It is at once empowering and staggering. Is there some predetermined outcome that, if not reached, will be considered "failure"? Or is this simply the freestyle section of the dancing game for the Kinect, you know, where you get to dance like a maniac for no good reason and then you see the sped-up video of it afterwards? Is there something I'm "supposed" to be making of myself, or is this simply a time to make of myself what I wish and then to live and thrive with the results? I tend to believe that it is the latter. When you start an RPG you make decisions about which class you will play and which abilities you will develop. Those choices are not meant to punish the uninformed, but rather to enrich the experience. I feel like that's how we are now. We're choosing who we'll be. The abilities and characteristics that we choose to develop now will certainly be with us for the rest of the game. We will use them, repeatedly, the beat bad guys and further the story line. At the end of the day, I hope to use them to rescue a princess. But the truth is, I could rescue the princess as a sentinel, soldier, or engineer. My choice to be a sentinel doesn't mean that's the only choice. I suppose that the most important thing of it all is that we make the most of the choices that we do make. If I am going to be a sentinel, I better be a dang good sentinel. Go big or go home.

Only 21 days remain in which I can make choices as a student during Spring semester of 2012. Roughly 100 or so days have already passed- my choices have brought me precisely -here-. Where will I be in three weeks? Geographically speaking, I'll be back at home, 90 minutes away. I'll likely be sitting at this very keyboard, typing on this very blog. But the person I am will be different. I'm hoping to be a better version of myself by then. I like remembering these things. They're not new thoughts. I'm sure you could find a nearly identical post somewhere in the archives. But it's important for me to remember them so I can keep them in perspective. It's important for me to write and use big words. I do enjoy the person that I am becoming. I'm happy to be where I am, and I'm grateful for all the mentors and friends that have helped me get here. I certainly wouldn't be who I am today without the great help and support of those around me.

Well friends, this pseudo-English major is headed to bed. Thanks for sticking around. Y'all mean a lot to me. I hope you're doing well and that life is treating you great. Things are rough sometimes, but that doesn't mean that things aren't okay.

(8) There's a reason for the world-- You and I (8)
(The Riddle - Five for Fighting) (and yes, I did just use the old MSN messenger emoticon key for the 8th note)