I’m going to say something I probably shouldn’t (for, indeed, what other purpose do blogs have?), but I hope that doing so will help other people, if they’re having similar issues.
My admission: I’ve been feeling like an utter fraud and a complete failure at a significant portion of my job. (Spoiler: It’s better now!) I’ve been beating myself up for literally years, because I didn’t think I had an acceptable level of technical competence—specifically, coding prowess. And while there are legitimate disagreements about coding in the library profession, I think we can agree: most web librarians need a certain amount of fluency with code.
For my part, I looked at these things that other techy librarians (never mind full-time web developers) were creating, and thought, “I couldn’t do that.” Some of my hesitation was legitimate: my job has grown and shifted to the point where I have trouble finding big enough blocks of time alone to do serious development, and that’s an issue. As I’ve pointed out in other posts, I split my time between being a web developer, a designer, a content manager, a marketer, a manager (in the policy-making sense, not the supervisory one), a trainer, a systems integrator, first-level technical support, and a friendly face at the reference desk, plus random committee work and service activities. I’m investing buckets of time into organizational change, and that takes a toll on my coding time. Also, although I’ve never self-identified as a great coder, as the job’s grown and time has passed, I’ve gotten rusty and lost some skills; honestly, I have to look up even HTML and CSS syntax pretty regularly. Legitimate issues.
But it’s worse than just a little hesitation, or some envy of my techier colleagues: I had actually allowed a little under-training and a little rust in my skills to turn into this huge wall of intimidation around code, to the point where even refactoring my site’s CSS (which, after 10+ years and at least three people adding on to it, is desperately needed) seemed too daunting to start. (And it’s still going to be a crappy job, don’t get me wrong, but I was literally scared to start. And, I mean, this is CSS, not, you know, rocket science.) Everything coding-related seemed too daunting to start, and I kept feeling miserable about it, not just at work, but in my spare time, too.
It didn’t help that my weekend forays into programming never amounted to much—mostly because other priorities kept, uh, taking priority.
And even when I took that Coursera course, I wrote off my implementation of Pong in Python as any kind of achievement, because it used a proprietary library instead of Tkinter, and because they gave us too many hints for me to feel awesome about my neat little piece of software.
Y’all, I wrote Pong in three hours, and I felt bad about it.
Feeling vs. reality
It’s worth adding that, back in my engineering days, I wrote seriously complex code in MATLAB to parse large data sets. I did useful things to arrays of multi-dimensional arrays (I’m also a little dyslexic, so, just imagine that for a second), and the engineering field learned stuff from the code’s output—or, well, my writeup of it, anyway.
I mean, I’m clearly not dumb, nor am I incompetent; but I felt dumb and incompetent. And that feeling created reality, in a way. It made me so afraid to start that I… well, I never started any optional coding projects for work; I put them off and did other things, instead. I was afraid to try.
So how did I get there?
Part of my problem with my perception of myself is that my knowledge of PHP—the primary language our stuff is in—has always been surface-level. I don’t fully understand how various PHP developers make the decisions to split their code between the multitude of files they generate. It looks random to me. Also, I’ve never really internalized PHP’s syntax, so I’ve always had to look up anything I’ve wanted to do, in the not-great documentation. Of course, whenever I finally found the thing that created the behavior I wanted to change, and I found the right syntax, then, yes, I was able to bend it to my will. But, honestly, I spent most of my time working in PHP feeling disoriented and searching around in frustration for the function that was called by the function that that other function called. I guess I found that disheartening.
And, as I alluded to before, I saw some really great things coming from other places. This is a great time to be a developer, because there are so many answers (many of them correct, even!) and so many resources and so much borrowable code available a search engine away! But it’s also a terrible time to be a developer, if you aren’t naturally self-confident: you can see how wide the gap is between your skill set and another’s. And, as others have noted before, the coding/development/software engineering field is so very broad and so very deep, that you are always faced with huge swaths of knowledge that you lack. Nobody knows everything, but the sheer number of things you don’t know can be crushing.
(I’d like to go into gender-related self-perception in STEM and stereotype threat and nerdy strutting, because they’re all factors, but this is already long. If that read like a string of nonsense, hit me up in the comments, and I’ll write that post. It’ll be shorter than this one.)
So I guess I internalized the message “I am slow and inefficient at coding” and also the message “Everyone else knows more than I do.” I did this despite others’ warnings, despite friends’ and colleagues’ encouragement, despite knowing I’m an engineer, damn it, and a good one at that; analysis and problem-solving are my domain! I committed the classic blunder (besides “never get involved in a land war in Asia”): I focused more on what I didn’t know (or didn’t know anymore) than what I did know. I competed with other people, instead of competing with past-me. And, probably worst of all, I didn’t try, even though, really, there was no risk.
That was pretty dumb.
Why the about-face?
This whole post has been in past-tense. I even added a spoiler at the beginning, so you’d know where we were going: I’ve realized I’m an OK programmer! I think like a programmer, and despite my woes with specific languages, specific syntaxes, and specific documentation, I never really lost that. (Side note: I’ve seen articles suggesting that “thinking like a programmer” can’t be taught. That’s nonsense.)
I did have one major revelation, though: I was forgetting possibly the most important lesson I’d been taught—by word, though not by deed—in my computer science education: don’t try to sit down and write the whole program linearly. Break your problem up into smaller pieces, and solve each of them separately. (Even if you’re not a coder, this is a good lesson. If nothing else, when you solve one piece, you get that boost from the success, and it makes the next piece psychologically easier.) Everything in school was either broken down for me, or was simple enough that I didn’t have to follow that advice. And, go figure, coding in the real world isn’t like that at all.
So that helped a lot.
And do you know what else helped? I could be glib and just say “practice,” but that’s not exactly it. I mean, yes, practice is inescapable, both in [re]developing skills, and in building confidence.
And the steam from that success got me to tackle a design/development problem at work that jQuery was, delightfully, perfectly suited to help with.
And the steam from that success (series of successes, actually, and there are a few more left to go) got me to tackle a project in Python that’s been languishing on my to-do list for ages: I wrote a little command-line application to take in a text file, find all the URLs in it, and let you know which ones work and which don’t. Size-wise, it was a great “first real project” in Python. It was probably the wrong choice for me, because, though I knew going into it that there are no great link checkers (because it is a Hard Problem(TM)), I have trouble NOT being annoyed that it’s imperfect. (I’m librarian enough that I fight perfectionism, yes.)
Still, it achieves what I need it to: it tells me which links in this document need updating. (Yes, I spent an estimated 10 hours writing a piece of software to check 40 or so links, because I didn’t want to read the document they were in. For any concerned Alaskan taxpayers, I want to add: I did it all between the time I got out of work on Christmas Eve and today; none of it was on your dime. :)) It probably has errors and inefficiencies, and perhaps seasoned Python coders would look at it and cringe. But I still feel good about it. I knew nothing about the modules I was using; at one point, I had 12 tabs open, checking various things to try to get this to work; and, even though it was a lot of work to get it there, it does work. So there. :)
I guess that’s my other revelation-slash-thing-people-already-told-me: Have a project you want to do. My first jQuery project was stupid and fun, and my second jQuery project and my Python project were both serious(ish), but helped me accomplish goals. I want to do ColorWall in jQuery, to see if it can be done, then maybe I’ll finally do it in Python. And I have a Twitter bot I want to write. And then there’s work stuff to do. And I feel like I’m up to it all, for the first time in … ever.
Finally, finally, I have developed a little bit of swagger. I’ve got the confidence to move forward, and I’m rapidly regaining lost fluency. (Two pieces of the problem, right there.) Now, if I can just build more time into my schedule for coding, both at work and at home, I’ll get good again—and then better than I was before!