Data Structures: a rant

(If you’re curious, the textbook from this class–and the source of the explanatory links I’m using in this post–is available online free here: http://interactivepython.org/runestone/static/pythonds/index.html)

– – –

I just got out of another Data Structures class. I zoned out halfway through, which is somewhat unusual for me. Happens more often in Data Structures, because the class starts at 8AM. (Fortunately, I think I found a less winding route to cut down on my time walking to class–hopefully the shortcut will make me less prone to lateness. I am not a morning person. I tend to dream about waking up and going to class. I’ve even slept through the 10AM labs, which is ridiculous and frustrating–but also kind of understandable, because they’re on the day after the 8AM class, and my brain is trying to get rid of its sleep debt.)

But that’s not really why I started tuning out the professor’s lecture today. It was the result of another impractical implementation on the projector, at which point a thought struck me:

If these data structures are so useful, why aren’t they part of the language already?

Python (which is what we’re using, 3.5 at that) is not a dinosaur, and most of the math for these data structures was done like fifty years ago. I’d understand if the point was to get C to be more efficient, but most people don’t even code in C any more. It’s not the right tool for very many of the jobs we have to do.

In fact, this class seems closer to a language design course than something practical to software development. I know that’s the point of the high-flown “computer science” department, but… come on. Even interviewers are getting the idea that this kind of question doesn’t matter that much in the real world. It seems more to me like something to be learned on the fly, when needed. Which in practice would probably just mean memorizing Cracking the Coding Interview because you need a job.

Why does this theory class have to be so… theoretical?

I wish the teacher would spend some time telling us when to use these structures, rather than just what they are and how they’re implemented. Otherwise I think this course may do more harm than good.

Why in the world would you ever use a singly-linked list? Most languages–and especially the ones most commonly in use–have array or list structures of their own, which are 1) optimized for you, 2) don’t require extra code, 3) have been tested far more thoroughly than your code ever will be and are thus more stable and predictable, and 4) don’t confuse the hell out of other people who come in and read your program!

Why in the world would you bother implementing a doubly-linked list either, unless you’re coding a programming language of your own?! None of this makes sense! We have a dedicated class for language design! We have a dedicated class for C programming! Why isn’t it in there instead?!

Ahem. *deep breath*

Hash tables are kind of cool, and so are binary heaps (although they’re less practical). My affection for their clever hackitude is rather stifled by the suspicion that, again, they’d probably be built-in structures if they were that useful. Like Python dicts–those are hash tables behind the scenes. Use those. Everyone knows what they are and you don’t have to code them yourself.

If you’re working with large amounts of data, hash tables and binary heaps could be useful. But the professor doesn’t talk about when, just how to use them. If you’re not working with big data, chances are you just need a dict or list, and can spare yourself and others the experience of trying to interpret your weird code later.

But the professor doesn’t talk about that kind of thing. I wonder if he’s getting homework assignments that use this stuff unnecessarily. He hasn’t been taking points off mine because my work still does what the spec asks for, as clearly/briefly/user-friendly-ly as possible. I haven’t been looking for ways one might use weird data structures in the assignments, so I don’t know if they’re designed to invite us to use them or what.

He also covered recursion, which I think is very useful–again, if you know when to use it, which depends both on the problem you’re solving and the language you’re using. I will casually use recursion to make my code cleaner-looking even if it isn’t always the most efficient option (in Python). But that’s for readability. Mostly I use it when I’m getting user input, and I stick the prompt in its own method and loop if I get bad input. That lets me put all the lengthy, messy error-checking off somewhere and the main program will get back a good value.

I think this practice is supposed to be kind of evil according to functional programming, because user input functions aren’t pure functions? Or maybe, because I’ve sectioned them off and make sure they return good values, they’re exactly what you’re supposed to do in functional programming. Don’t know yet. It works, anyway.

I still use “else:” almost exclusively for “Can’t Happen” errors. It saves me headaches when I screw up the recursion. That’s a minor change with using recursion, but it’s an issue only while writing; I’ll put in extra effort when I’m writing the program to make sure it’s easier to read later.

What I will not do is write code whose purpose is to make me look or feel clever for writing it a certain way. That’s insane. Sacrificing readability, even efficiency because you think it’s cooler to use some homebrew data structure code rather than a freaking built-in Python list? That’s absolutely insane.

When interviewers select for people who know how to do this, I wonder if they realize they may be selecting for a subset which includes the actual worst candidates: the smug “Of course I know everything, if you lesser mortals don’t, that’s your problem, Google it, and also I have very strong opinions about i++ vs. ++i and will totally correct you if you’re wrong.” Fools and incompetents may eventually learn. This person doesn’t think they have to.

(Of course, sometimes a person like that is useful to look impressive in customer meetings, but in my admittedly limited experience, they’re just as likely to insult your customers as to impress them. Ever seen a bunch of startups pitch? Some of those folks need an attitude adjustment. Of course, they’re going to fail; it’s hard to have enough empathy with customers to produce a good product if you have such scorn and disdain for their intelligence. Then they’ll claim they went under because they “failed to pivot.”)

Oh, one more thing. Big-O notation is pretty useful. Even if your main use for it is understanding what other people are talking about, and/or making yourself look impressive. It’s so you can find out which of two algorithms is more efficient, which will probably be something you’ll need to do eventually. It looks way more complicated than it is.

I could very well be wrong about this, and I’d be pleased to find out if I were. I’d love to find something that’d make me a better programmer. I’d be terribly pleased to find out I wasn’t learning something nearly useless. But I don’t think that’s the case.

The CS math course I have (enigmatically titled “Discrete Structures”… I have yet to find out why, unless the reason is “because it sounds fancy”) seems a little more practical at least. Logical thinking comes pretty naturally to me, but I know it doesn’t to everyone, so it makes sense to cover it. I know there’s also set theory, graph theory, and combinatorics later on in the course, and I’ve heard those are good things to know for programming. I guess I’ll find out.

Oddly enough, it’s my English course that’s the most practical. The professor decided to forego the traditional giant clunky writing textbook and told us to order this list of like eight different short story collections, which we read and then write and talk about. That takes up about half our class periods. The other half (each day is dedicated to one or the other) is the professor talking about writing: elements of stories in general that are important (like what the stakes are–is war at risk, for instance?), writing style (like sentence structure, word choice, voice, POV), what it means to have universal appeal, what it means to capture an audience and how to get their attention–and especially the skills of critical thinking and backing up your claims.

This format is a little odd for a class called “College Writing and Research”–but it isn’t bad. I think it’s more effective than the normal route. No writer I know learned writing out of a big clunky textbook, or by doing essays on symbolism in Dickens or whether school uniforms are a good idea.

Since CS folks often point and laugh at the liberal arts, saying their study is useless bull and all those English majors should be studying something useful and practical (like computer science of course), well… I have an uncomfortable piece of news.

Not that I’m saying majoring in English is more likely to get you a job (although it’s better off than, say, Gender Studies). But knowing how to write effectively, which my English class will teach you, is far more practical than knowing how to invert a binary tree.

Sorry, prof.

Please read the comments.

Advertisements

On college degrees

Just some thoughts I’d like to get out of my head. I’ve thought a lot about this (of course) without writing it down. I’ve mentioned before that I don’t intend to finish my bachelor’s degree, but I haven’t really explained why in detail, even though it’s the sort of thing I post about here. So here it is: why formal credentials in general, and college degrees in particular, are not the end-all-be-all of having a stable and successful career in technology.

Hiring hackers

Technology is one field where college is kind of an awkward proposition. Take these classes and you get a piece of paper that will get you a job. Okay.

The main problem is that it’s hard to gauge whether someone knows their stuff without working with them on something, or at least seeing something else they’ve worked on and trying to judge its quality. This makes it really hard to hire good programmers.

But HR departments don’t like either of those options: the point of interviewing is to weed out hopefully all the posers BEFORE they get into your company, and keep the ones who know what they’re doing (that means tricks with at-will employment may be out if they have problems retaining people). And they’re not technical enough to judge whether a portfolio is good quality or not.

The latter situation is why there are more technical people doing interviews for tech positions these days, rather than HR. But HR doesn’t like that either. They want to have standards about who they hire: new employees have to have such-and-such a degree, or certification, or at least they need x years of experience in the field.

The thing is, they’re fighting a losing battle. HR isn’t necessarily evil, but it is ineffective, at least for this purpose. Someone can have more letters after their name than a game of Scrabble, and a whole handful of certifications, and still not know what they’re doing. And a candidate can gain x years of experience at any company–whether they did good work there, or whether that company even knows whether or not they did good work, is still a big question mark. But a technical interviewer looking through someone’s GitHub account can see empirical evidence of whether that person can code, and perhaps even how well they work with other programmers.

(Besides, people with letters after their name are extra expensive, because they’re paying off student loans.)

Whether universities like it or not, the job market is a big part of people’s decision to go to college. Will their degree pay for itself or not? And if it won’t, are they really willing to pay that much for it?

Learning to program ≠ college classes

It’s really hard to teach programming, too. Aside from the fact that programming is just something you have to learn by doing, and programming students are de facto going to be teaching themselves to some degree (no pun intended), it’s hard to keep the classes current. By the time a book on foo is written and then the curriculum is developed, foo might be on its way out of date.

Most universities get around this by saying that they only teach theory, which is an important component of what a programmer needs to know. But it isn’t everything, and teaching theory without teaching its applications means that you might not understand the theory as well. It also means that by the time you get into the workforce, you don’t know half the stuff you need to know unless you’ve been rigorously self-teaching along the way. But the actual degree hasn’t taught you how to do stuff. It’s taught you how to learn how to do stuff, and a lot of degreed people are fooled into thinking that they know everything just by having the degree. Similarly still fooled are a lot of HR departments.

But it doesn’t work that way. And sometimes when you get down the the brass tacks of things, people realize that while they’ve got the theory down pat, they don’t… actually… like coding. Or they have no design sense, and aren’t artistic enough to pick it up; they thought computer science was actually science. Or they’ve become frustrated that after four years and $150,000, they still have a long way to go.

These are not the people you want to hire. These are not people who should be in this career. Programming is not for everyone–it takes a certain kind of personality–and just because there are a lot of programming jobs that are stable and pay well does not mean you should go into it.

A degree will teach you a lot. But it won’t teach you how to program–it’ll teach you how to learn to program–and it may not teach you whether you like it.

(That goes in both directions. Some people who do have the inclinations for programming [patience, ability to focus, love of learning and making things] may find college classes intolerably boring after a while, for much the same reason I haven’t read the last fifty pages of any of my coding books: you usually have something you want to build by then.)

There are other things to do

For the price of a university’s tuition–let’s say 30K a year for four years, which is a rather conservative guess for this–you could bootstrap a startup. 120K would probably last some startups all the way until the stage they needed a Series A round from investors, and for many others it would be all the funding they needed.

If you’re not fond of startups, you could put the money towards rent and food, and become a freelancer. Say you want to be a web designer/web programmer. Spend a year learning what you need to learn on your own (you would have at university anyway) and making friends. Then, if you have the right contacts, or at least the guts to look for companies with outdated websites and call them up with an offer, you can get yourself a pretty stable income not only as designer but as maintainer.

Or you could go to a coding bootcamp rather than a university. They’re becoming more and more of a legitimate option these days, and they’re generally cheaper and more practical than normal schooling.

Or you could spend the time learning and contributing to open source. There are increasingly more companies that would rather see a packed GitHub portfolio than a degree.

Friends

There are reasons to go to university, of course; a degree still carries quite a bit of weight, but there are also reasons to go for just a year or two. The major reason, at least for me, to just attend and take classes you like is the other students.

 

That means people who will build stuff with you.

I don’t know if that means as much to other people as it does to me, but I think it’s really important. I want to work with other ambitious nerds who want to make stuff and tinker with the world as we know it. I think two or three can do a lot more than one, and a lot more than they’d do individually.

Also, the theory is important, as are some classes that are maybe better taught by walking through them with a class. I want to know about data structures. I also want to learn Lisp, but I’m a little intimidated by it; the college-class habit of going through all the tutorials and explaining everything, which I find somewhat tedious in a lot of cases, might really help in the case of learning Lisp. (Or whatever functional language they teach.)

Professors are pretty important to me too, because the right professor can be really interesting to listen to–particularly when you get them talking about something that isn’t strictly what they’re supposed to be teaching. I know a lot of what I know from listening to older programmers. In fact, the opinions I’m talking about in this essay are something I discussed with one of my favorite teachers last night, and he was agreeing with me on all points that I can remember (it was a long discussion).

The price tag

I don’t want to be in debt all the way through my thirties for something that won’t really teach me what I need, particularly when I can learn through books that are 1% of the price, and by the time I need a serious job the piece of paper will mean less than my GitHub account if I’m not lazy.

GitHub is free. Books are cheap. University is neither.

I’ll attend college if that’s how you find people who become collaborators and testers and cofounders. But I won’t pay a fortune to finish it.

If I haven’t made it clear, my plan is to go to university for maybe two years–and probably not the same university or even the same city–take what classes I want while I hold down a part time job or internship, and then just leave. Probably by then I’ll be entrenched in a startup or, if not, can find an employer pretty easily. My skill set is pretty well-rounded right now, even if I don’t have a ton of experience, and I’ll have an Associate’s degree anyway.

These are opinions I’ve held for months, but it’s really easy to get confused about this sort of thing when everyone else has a different opinion about what you should be doing and what’s important. My teacher last night said maybe their advice just reflects what works for them, and the different paths are all valid, at least to some degree. That’s probably true. I, in turn, don’t intend to say that my plan is what everyone should do. Y’all can do whatever you like as long as it works for you, but I’m warning you now that a college education is not going to teach you everything you need to know to build things, whether for yourself or for an employer.

And maybe I’m wrong and my plans to skip the piece of paper will blow up in my face. (In which case I’d just go back and get it… I’m not sure why people are talking about my plan like it’s a permanent, life-ruining mistake.) But if I make a choice about this and I’m wrong, I’d rather have that be because it was my own choice that was wrong, not something someone else convinced me to do. I would rather trust myself and make my own mistakes than end up bitter about someone else’s.

What college visits are like for CS students

These are actual things that actual colleges have actually said to me. I couldn’t make this up. And this is just a sample of the silliness–even lazy comics take time to make so I sure haven’t covered everything.

It felt good to write these though.

leadershipmeeting-cs-head

This isn’t what the guy looked like, by the way. I’m doing some minimal paraphrasing for length, but this is actually what I was told.

Later during that conversation, he would give me career advice that told me in no uncertain terms that he hadn’t left his ivory tower and looked at the job market–or even just kept up on his reading–for 15 years.

I’m not going there.

Pitfalls in learning to program

Tim H. commented:

[…] do you have any advice based on personal experience from when you first started coding? Things to do (or avoid doing) or perhaps something that you know now that you wish you had known when you first started?

Oh, please. I wish I could say that I took all the right turns while learning–if I had, I’d be a much better coder than I am–but that’s not the case.

This is probably more than you bargained for, but here–you’re now the… third? commenter to get a full post in reply to a question.

Building on your own

The biggest thing is that building stuff outside the books and classes is the most important thing to do. I’ve been coding in some form or another since I was about twelve: RPG Maker XP at 12, basic web design at 13-14, VB at 15, Java at 16, and then I went to college–I didn’t choose all my tools, most of this is an expression of what classes/books/programs were available to me at the time. But I usually didn’t go out and build stuff with what I learned in my classes.

I did try to make some games with RPGXP, but I was pretty awful at it because I didn’t know Ruby (the game maker has a Scratch-like interface that generates syntax) and the English documentation was very lacking (I looked). And I put together a few web sites for my parents’ birthdays that… were actually pretty nice-looking, but never got published. I was kind of lukewarm about VB, and I had a hard time coding in Java on my own computer for some reason–something about NetBeans not wanting to work.

–Basically, I tended to use the stuff I self-taught (RPGXP and HTML/CSS) more than the stuff I learned in classes (VB and Java). I did have a class on HTML/CSS, but not before I self-taught it, which was good because the class was horribly outdated. That repeated itself with the Linux class–which was taught very well and was up to date, but didn’t teach me as much as I’d learned by tinkering.

School isn’t as useful as you think

This pattern has held consistently through college: I learn better, and learn more relevant stuff, by screwing around with stuff on my own than by sitting in a class.

What I learned in class: Flash, old Dreamweaver (which was as bad as Flash), VB, Java, pseudocode markup, flowcharts (as if I couldn’t make those before), Windows networking, shell scripting, C#, .NET programming (sort of–the class had serious technical difficulties)

What I’ve self-taught: RPGXP (sort of), HTML/CSS, Linux, Python, working with an API, and a tiny bit of FileZilla and phpMyAdmin for freelance web work. Plus all the stuff I read online about programming and startups and businesses and new technology and other awesomeness of that stripe.

What I’ve used: the second list (minus RPGXP really)

What I feel like I know well: the second list (minus RPGXP again)

I’ve long maintained that I’m going to college to get a degree (formal credentials) and to meet people. I’m much less there to learn, because if that were my only priority, I could accomplish it more cheaply and efficiently by sitting around in an ethnic restaurant of my choice with some books and my laptop every day.

Although, probably the teacher who’s taught me the most is Mr. Noord, because he rarely stays on topic for more than half an hour, and the stuff he ends up talking about tends to be more useful and interesting. Don’t tell the school board.

It’s totally different for networking students though. Then classes are way more worthwhile because the school has the hardware they need to work with, and networking is easier to teach in a class.

Programming is an art form that can’t be taught in a class. Programming is a separate skill from knowing the syntax of programming languages, which can be taught in classes. Knowing the syntax is like memorizing a French textbook. But to learn French, you have to speak it (write programs), listen to other people speak it (read programs), let them correct your speech (take criticism from older programmers), learn the current grammar and slang rules (style and best practices), and keep using your skills.

Classes just don’t usually let you mess around with stuff, and when they do, they put lots of restrictions in place: how long you get to work, how fast you have to work, what you can make, and what other things you have to do or write in order to discuss what you learned so someone can prove you learned it and somehow quantify what you did. It’s a real pain. And then you have to pay for them, instead of getting to spend the money on new books or tools or hardware.

I’m not saying that schools can’t be useful. They can be! They can teach the basics and introduce you to other programmers, and they introduce you to some great teachers and other students. They just won’t teach you the sort of skill that makes a great programmer.

Books are quite a bit better, but still watch out

Books still won’t get you all the way; you have to build on your own. But, at least for me, they’re definitely more productive than classes, in terms of learning a new technology or language.

Books tend to a) be cheaper, b) invite you to mess around freely and without restrictions on time or what you do with the example code or stuff like that, and c) let you choose your tools. When you buy a book, there aren’t required classes. You get to study what you want.

The tools you choose are important

The main reason I’ve never used VB or C# or Flash or the other stuff I took classes on isn’t necessarily because the teacher was bad or the curriculum was awful. On the contrary–I’ve had mostly great teachers.

But the technologies are pretty crap, to be honest.

If you’ve been around very long, you know about my burning hatred of Visual Studio. I didn’t always hate it so much. I used to be lukewarm towards it, back in the days I was using VS 2012 for my Visual Basic classes. We had technical difficulties with it even then, and it liked to crash and all sorts of crap, although nothing like the temper tantrums it’s thrown in my more recent classes.

But now that I know what programming is actually like, I look back on it and realize how boring and tedious it was. It sucked! No wonder I wanted to go into psychology instead. I thought coding was cool, but sometimes I wondered if I just thought the idea of coding was cool and I liked the romantic techie-nerd image it let me imagine, because what I was doing was not that much fun.

(Straight-up HTML and CSS isn’t very fun either, to be honest. Once you get good at it, both the novelty and the challenge kind of wear off. I’m looking forward to learning to code dynamic web pages, though.)

Java was okay, but we didn’t get very far into it, the coding examples were largely busywork, and it was really complex. I think we just got a bad textbook, honestly.

The books you choose are important

The difference between a bad textbook and a good textbook is like the difference between a bad teacher and a good teacher.

Here are the different kinds of books:

Diving Into ASP.NET, MVC, TLA, GPS, and SAT by J. Random Microserf

This will probably have some geometric feature on the cover. It’ll look deceptively shiny and colorful, but it’s as engaging a read as the Terms of Use agreement for the technology it’s purporting to teach. Said technology will of course be the kind that has a Terms of Use agreement, because these books are usually made in order to sell both the book and the IDE or language or whatever the book is about, plus all the attached certifications (which probably all have test prep books of their own).

They’re written by someone who probably does not like the technology they’re writing about, even if they say otherwise in the intro. This will translate into the writing, and you will end up not liking it either.

Generally, these books are best used as eBay fodder or, if the technology described therein has already flunked out (it will soon if it hasn’t), as expensive firewood.

Learn Foo in 24 Hours!!!!

You will not learn foo in 24 hours.

You may get a basic but deceptively broad understanding of foo. But you will not have learned foo.

This book is not quite firewood. It may be helpful, if not so in-depth.

Weird homebrew-looking e-book sold on Amazon

?????

Head First Foo

Made by O’Reilly. This will have a lot of pictures and silly jokes. They’re great for learning from if you need to get a complete understanding of a technology quickly, or if you’re a beginner and you’re kind of intimidated.

I lose patience with them, though, under two circumstances:

  1. I have something I want to build, and I don’t want to sift through 50 pages of pictures of tigers and pizza before I find the bit of information I’m looking for. What I need is not exactly a reference book; I just want the info in a more dense and organized form.
  2. I’m trying to read it as an ebook. They don’t translate well to the format. Don’t buy these as ebooks.

Notably, they’re bad reference books, as you might have gathered. Don’t get them for that either.

Making Stuff with Foo

This could be “Building Dynamic Websites with Django”, “Creating Apps with Kivy” (<3), et cetera.

It’ll contain something like this in the intro.

I’ve been using this technology for foo amount of time, and I think it’s a great tool for doing bar because of how it bazzes the quuxilators. I tried some other ways of doing bar and overall, I like this one the best because it’s well-designed and has great features.

Anyway, I thought a lot about how to write this book, and you might notice that the example code (which is on GitHub at [URL], by the way) is actually not a bunch of different projects–it’s just a couple projects, and we change them over the different chapters so you can see the development cycle better.

I really hope you have fun making stuff with foo using this book. If you find any errors along the way, send me an email at foo@gmail.com.

Not exactly, necessarily, but approximately that tone–you get the idea. The tone of the book will be friendly, but practical and not too goofy. These are great books!

It has a picture of an animal on the front?

That is probably an O’Reilly book. It is worth its weight in gold.

These are very often the “Making Stuff with Foo” variety.

If O’Reilly doesn’t make a book about a technology that is well known enough to have school classes taught on it for, say, a year… that technology may not be worth learning. Unless you can find someone else who wrote a good “Making Stuff with Foo” book about it, and then it might be okay.

Dry Internet documentation

For when you already know what you’re doing. Confusing, frustrating, and boring if you don’t. Buy a book.

Good Internet documentation

Save your bookmarks!

Make stuff. Solve problems. Meet other nerds. Eat cake. Browse GitHub. Play a board game. Tinker with stuff. Install Linux on something. Eat cake again. Hang with your nerd friends.

Have fun.

Happy hacking!

Career planning (and other totally inconsequential things)

Last weekend I was in Chicago, visiting my older brother Tim and his wife, because it was my younger brother Ben’s birthday. We had plenty of fun gaming together into the unholy hours of the morning, especially Ben, who stayed up all night playing Skyrim. He got a new (well, refurbished) laptop–a fairly recent model Latitude, very nice–and I got him seven cheapish games to put on it, plus RPG Maker VX Ace (normally $70, only $24 when I got it from Humble Bundle’s end of summer sale). The latter is my way of making sure he gets an introduction to programming for his 13th birthday, as I did for mine, although I noted that Ben would probably appreciate an introduction that wasn’t a textbook. He doesn’t have quite so much patience for them as I did, I think.

This is in between my trying to deal with a headhunter who, it has to be said, kind of made me feel like I was talking to a used car salesman.

He was very excited about me. He had a job opening for me and “badly want[ed] to talk to me” because I was a “strong candidate.” He sent me business-speak job descriptions that didn’t actually tell me what the job did, but he was very insistent that I should interview as soon as possible because this “opportunity” might go away soon.

It wasn’t that the job was bogus–it was a John Deere job, and I actually am about as qualified as you can find for this job in this area–but that I think he was foreign (because of his name and slightly stilted grammar), not very good at persuading Americans yet, and hadn’t found enough candidates to meet his quota or something.

He called first on Thursday, while I was at work, and I ignored him; I was booked for the rest of the afternoon/evening working on Raspberry Signage at school, but when I looked through my email, I’d found multiple (duplicate) emails from his company.

The next day at work, they called me again… at the same time. (If that was a bad time of day the day before, why try the same thing again?!) Then they emailed me again. I emailed back, and then emailed my resume when I got home, offering to interview on Monday. This guy said he wanted me to interview later that day (Friday; bear in mind it was already 1pm), except I’d left for Chicago by then. I emailed over the weekend and said he’d have to take Monday, so where should I be and at what time.

Monday rolled around and he hadn’t emailed back, so I sent another message asking about it. Instead of telling me time and place, he’s suddenly not urgent and wants me to review the details of the job again. I say I don’t want to work a three year contract. He says the job is for three years, and could I do that. I say no, I don’t want to work a three year contract, but offer to interview anyway and negotiate. I say I could be talked into a one year contract. I say that if the deal is particularly good I might consider the longer contract. I say that even if it doesn’t work out, it’ll look good for him because he sent along a qualified candidate.

What does he do then? He drops me. He gives me a generic “we’ll keep you in our records” message and then leaves. I’ve been thinking about going straight to John Deere and asking about the job without going through their headhunters… I’m not totally sure how to do that, though, and I don’t want to work a three year contract. I don’t want to be pinned down to any one city, especially not my hometown, which is not rich in hackers, and I don’t want to commit that much time to a job I’m not sure I’ll like. Maybe I should just go in person and talk to their hiring/HR/whatever department.

Anyway, that’s my gripe out of the way. Don’t get me wrong, I like being contacted by headhunters, I just thought this one was not very considerate.

I’m trying to decide which city to land in. I’m very fond of KC, but my mom isn’t. It’s a 6.5 hour drive from home at best, for one. (That’s in September. It’d be worse in January.) Also, the driving in KC is pretty awful–much as I like how friendly and creative the people are, they’re also terrible drivers. My mom is used to Chicago driving and manages easily there, but KC was an anxiety attack for her–that’s how crazy it is. I like the culture and the people there, and the weather, and the low living expenses. It has a vibe of creativity, like everyone there likes to make new things.

Mom’s trying to sell me on the idea of Chicago, which is three or four hours away. I don’t really need to be sold on the idea of Chicago as an awesome place, I’m just working on reconciling it as a place I want to live. It has a bunch of stuff KC lacks–sane(r) driving, a larger and denser metropolitan area, more diversity, and better colleges–but it also includes qualities that are the opposite of what I like about KC: the people aren’t too friendly (by the standards of a small-city Iowa girl), the weather is weird because of the lake and not very warm, and it’s expensive to live there. I haven’t spent a long enough stretch of time in Chicago proper to understand quite what the city’s “message” is–I would say it’s somewhere between independence, wealth, and a desire to be urban chic.

Then there are the vague pulls of the famous hacker universities in California and Cambridge. It’s like–I don’t know, it’s hard to describe. I want to land somewhere with a serious culture of the kind of people who, if you approached them with a startup idea, would get fired up about it and start building it with you. People who aren’t content to just go to school and then settle down into a Dilbert career doing something they don’t really understand. People who understand that molds and roles they’re expected to fit into are completely ephemeral in technology, and that if they’re good hackers who like to work and make things, they can beat out their own way. People who want to make something big and important.

In short, I’m looking for a community of ambitious hackers. Ambition gets lonely without company; that’s why startup hubs work. I want other people around to inspire me to create more, and to partner with me in making it great. Berkeley, Stanford, MIT and Harvard are all kind of… brand names for that culture. More expensive, but a good, known reputation.

Of course, I don’t really have the formal credentials traditionally required to get into those schools anyway. My GPA bobs pretty much constantly around 3.5. I have a GED instead of a finished HS transcript, and my AAS degree doesn’t necessarily transfer enough credits for me to be considered a full-on transfer student. I don’t look very impressive on paper. On the other hand, a college-degreed 19-year-old with an internship and a big project under her belt does look impressive–just not in the ways colleges are looking for.

It’s funny how the colleges most known for being hacker-land might look down on me for hacking my education. But they’re honestly not my top choice anyway, because they’re expensive and really far from home.

Tim thinks I should look into University of Illinois at Urbana-Champaign, which I was thinking about earlier anyway. They’re supposed to have a good CS program. I don’t know, though. I’d have to have a good look at the city and the vibe around the campus. Tours are great and I’m sure my parents would like to discuss with the advisors and so on, but I think I’d learn more about the place by sitting on a bench in the middle of the quad with a sandwich and watching people, and maybe having a chat with a few students who aren’t being paid to sell me the place. I’ve never been in the city, so I don’t have much to say about it.

I forget whether I’ve mentioned on the blog, but I don’t plan to finish my four-year degree. I intend to go for a year or two, maybe three if it’s part-time while I work–basically until my college savings account runs out of money–and then I’ll find my own stuff to do. I’m only going to get better at programming as I continue, and I don’t think I’ll have an issue finding a job, ad hoc schooling or not.

I’ve been thinking about bouncing around from city to city. If I don’t plan to finish a degree anyway, I don’t need to worry about credits transferring, so there’s nothing to worry about if I go to Chicago for a year, make friends and contacts, take classes, and work for that year, and then go to Kansas City the next year and do the same thing, and then I’d know which one I really liked better–in fact, if I wanted, I could go to Silicon Valley or Cambridge for a year after that. The one anchor I have is my hometown, and it’s not as strong an anchor as, for example, a mortgage or a dependent family.

The appeal of that idea is really strong to me. I think one could learn a lot about the world with that method. You can see what’s out there without committing to anything until you know you like it really well. It seems like a good way to put yourself in a position that keeps your options open and allows some of those options to be the big, adventurous kind I’m especially attracted to. It’s a way to balance the ambitious/crazy with some practical.

If I found a good job offer in my hometown for the year, though, I’d seriously consider it. My city’s a nice place to live. My problem with my hometown is twofold: there aren’t enough programmers, and that it’s my hometown. I feel like a coiled spring here. I’ll be awfully homesick when I do leave, but I need to get out and adapt to, you know, being an adult. That’s not going to happen as long as I’m living in my childhood bedroom in my parents’ house.

Aside from that option, the first city I tackle will be one of the three I mentioned: KC, Chicago, or Urbana-Champaign. Namely, the one that has the best job offer for me after I go looking this spring. It’s an anti-decision, really–a way for me not to have to choose–but my mom seems to be happy with the compromise. My dad is still coming around to the idea that I won’t finish my four-year degree, but it helps that Tim never got a computer related degree and is now working as a well-paid developer based on his personal merit.

Wow, this got long. I had a lot on my mind.

A Full Summer

I have identified the biggest gap in my knowledge and have been working on patching it. Took me long enough.

The major problem is that schools just don’t teach object-oriented programming. Sure, they teach languages that use it… they show you how to program dinky little projects in them, make Hangman games and so on. But they don’t teach OOP principles, and that’s a wall I’ve run into. It’s why I’ve never felt comfortable saying I have a working knowledge of a language.

So I went back to Learn Python the Hard Way. I got bored with this book earlier because I was determined not to skip stuff in case I missed something important (a good tactic dealing with textbooks that aren’t written so well, which is most textbooks), but the book was written with the idea that it’d be your first programming language, and it wasn’t mine. It’s also a little condescending, but this is probably justified considering the book’s target audience… you HAVE to talk down to people a little if they’re not sufficiently tech already.

Determined to learn OOP principles, I recently dived back into the book. I spent a while grinding through the first 20 or so exercises, skipping most of the study drills because I could answer the questions they posed without looking up the information, and making one or two snarky notes in the margins for the benefit of my younger brother who’ll be inheriting the book once I’m finished with it. I had a trip out of town with my parents recently and took the book along, reading it in the car and suchlike.

After reading ahead quite a bit, I decided not to bother with anything else until exercise 40, when the book starts in on OOP principles. Yes, that’s skipping a quarter of the book. No, it probably won’t help me learn Python’s syntax. But let’s face it, Python’s syntax is designed to be non-headachey and easy to pick up anyway, and it’s not what I came for.

 

Exactly a month from today is my 18th birthday. This opens up a lot to me which will keep me busy.

First, I’ll be working on getting a driver’s license. Yes, I’m in America and if I’d been more on-the-ball about things I could have gotten it before now, but I waited too long to get my learner’s permit and there are weird legal qualifications about how long you’ve had the permit before you can try for a driver’s license if you’re underage.

Second, I can apply for more jobs. It’s ridiculously difficult to get a job in my city if you’re under 18. There are only a few places that’ll even look at your application. Since I’m going to be moving out next year, and I don’t particularly want to accumulate massive amounts of debt, I need several thousand dollars in order to move into and outfit my teeny-weeny apartment (which is both cheaper and saner than living in the dorms at most colleges). This requires some planning, and, yes, a job.

I have a few places I’d really, really like to work. Particularly, I want to see if I can land a job working at this car dealership that needs techs–I haven’t seen much information on the job, but my best guess is that they need someone to service the computers embedded into their luxury cars. Maybe those computers even run Linux. That would be such a cool job–something I’d really want on my resume–and this is one job where I’d probably get to see better than minimum wage. Even if my guess about what the job does is off, finding a tech-related position would be a real boon.

 

Third, I’ll also be finding out what community college I’ll be attending next year. The one I’m attending now is mostly fine and I like a lot of the people there, but I have… a few HR issues with one of their most heavily employed teachers. Let’s just say that if you’re a teenage girl in a programming major, not everybody respects you; the teachers are not exempt from this effect, and not all of them are able to keep their personal resignations on this front to themselves. The way the school dealt with the issue left something to be desired. I won’t name names, or even reveal the teacher’s gender.

This is not an issue of disliking this person. This is an issue of, “this person does not respect me whatsoever and actively tries to create a toxic environment for me.” They teach many of the classes I need for the rest of my degree.

So I’ve been looking into finishing my AAS somewhere else. The idea of not paying this person’s salary is very appealing. However, if I end up taking their classes again, I’ll start recording the classes on the premise of wanting to listen to the lectures later. If said teacher intends to continue their disdainful attitude, I’ll have some more evidential weight on my side and won’t so easily be dismissed. Such a recording device would most likely prevent this behavior entirely, though; the teacher is too smart to allow me such evidence. If the teacher refuses to allow me to record his lectures, I’ll ask them to explain why, which will be a difficult question, especially since they make lots of videos and put them on the Internet.

Fortunately, it may not come up. There is another community college nearby with a very similar track to what I’ve already done; most of my courses will probably map.

 

Because I’ll be so busy, I’m hoping I can tackle learning OOP and get that particular project finished within the next month.

Better get on that.