5 years, 2 months, and 28 days ago I dropped out of high school, and in a few hours I'm going to graduate from college. This journey has been surreal, and that it's coming to an end hasn't even begun to sink in. I lack the words to express my thanks to my family and friends who've been with me through this.
However, I think I owe an even greater thanks to the open source communities I've worked with. Family and friends you have a mutual obligation to. But open source communities are all volunteer efforts, and I've often voiced that users of open source have no obligations to give back, that the freedom we offer is the freedom to give nothing back. And yet people do give back, again and again, in ways that completely floor me. Without these communities I wouldn't be anywhere near where I am today, they've given me friends, professional success, the opportunity to travel the world and do something I love, and most importantly, the sense that the work I've done has helped people.
For several months I've known that I wanted to write a "graduation post", but I struggled to come up with any particular narrative for it. I still don't have one, so instead of writing about anything in particular, I'm just going to offer some things I've learned:
Never be threatened: When people are threatened or scared, it affects their decision making. My solution to this has been to try to make myself unthreatenable. For example, I got through school by knowing that I was good enough at what I did that I could get a job without it, I avoid being threatened financially by saving effectively. I've found that this is more or less a necessary condition to being happy.
Be willing to walk away: This is probably an extension of the first one, but if you're anything like me you make mistakes, a lot of them, with varying degrees of badness. The only way not to get bogged down by them is to be willing to walk away from them. This is not to advocate abandoning something or someone, but rather that there is no hole too deep, no sunk cost too great, to not be worth leaving.
Help others to be lucky: I've been extraordinarily lucky. I define luck as the result of a decision made without the ability to predict it's consequences, given I dropped out of high school I was lucky to be able to get into college, even though I made a lot of good decisions between those two events (to this day I assume my acceptance at college was the result of a clerical error). The 9th season of Scrubs is not well liked by Scrubs fans, but it contains one of my favorite bits of dialog: "I've had, like, 15 second chances in my life. You deserve at least one, right?" The best I can do from here is to help someone else to be as lucky to get a second shot as I was.
The people are all that matter: I remember after a school trip a friend once told me that that he'd really loved where we'd been, and that he couldn't wait to go back. And I remember telling him, "No, this place was boring as hell, but we went with our entire class, all our really good friends, of course it was awesome". Just about everything worth doing is defined by the people you do it with, pick good ones.
If you can put a number to it, it probably doesn't count for much: I used to love numbers: IQs, GPAs, salaries, anything that you could represent as a number and compare I thought was awesome. But more and more I've found that they measure less and less. I can't assign a number to what makes someone a good programmer or a good friend. But as a society we're obsessed with this, because it gives us an illusion of accountability, but really it just makes us arbitrary. Because I'm pretty sure if you listed the traits that make someone a great programmer, you'd be picking a lot of things from two opposite sides of a spectrum, and a bunch from the middle as well.
We're all people: And in my experience most people are at least a little different from each. Slavish defferal to these, or any other pieces of advice probably won't work for you, nor will treating a large group of people as anything other than many different individuals.
It's been more than 5 years since I made the biggest decision of my life, and I've been fortunate enough to have enough opportunities for a life time in this short time. All I can hope for for my future is that absolutely nothing changes: that I still get paid to do what I love, that I stay in contact with good friends, and that I'm able to pay it forward.You can find the rest here. There are view comments.
Lately I've been thinking quite a lot about education, both my own and in general. I ended up writing quite a bit about it. You can find all my thoughts here (PDF warning). I stuck it in a PDF because I think it's a more canonical form. I'm interested in hearing any thoughts people have, both about what I wrote and about education.You can find the rest here. There are view comments.
A while ago Eric Holscher blogged about things he didn't learn in college. I'm going to take a different spin on it, looking at both things that I did learn in school that I wouldn't have learned else where (henceforth defined as my job, or open source programming), as well as thinks I learned else where instead of at college.
- Big O notation, and algorithm analysis. This is the biggest one, I've had little cause to consider this in my open source or professional work, stuff is either fast or slow and that's usually enough. Learning rigorous algorithm analysis doesn't come up all the time, but every once in a while it pops up, and it's handy.
- Finite automaton and push down automaton. I actually did lexing and parsing before I ever started looking at these in class (see my blog posts from a year ago) using PLY, however, this semester I've actually been learning about the implementation of these things (although sadly for class projects we've been using Lex/Yacc).
- Compilers. I've learned everything I know about compilers from reading my papers from my own interest and hanging around communities like Unladen Swallow and PyPy (and even contributing a little).
- Scalability. Interesting this is a concept related to algorithm analysis/big O, however this is something I've really learned from talking about this stuff with guys like Mike Malone and Joe Stump.
- APIs, Documentation. These are the core of software development (in my opinion), and I've definitely learned these skills in the open source world. You don't know what a good API or documentation is until it's been used by someone you've never met and it just works for them, and they can understand it perfectly. One of the few required, advanced courses at my school is titled, "Software Design and Documentation" and I'm deathly afraid it's going to waste my time with stuff like UML, instead of focusing on how to write APIs that people want to use and documentation that people want to read.
So these are my short lists. I've tried to highlight items that cross the boundaries between what people traditionally expect are topics for school and topics for the real world. I'd be curious to hear what other people's experience with topics like these are.</div>