As I’m waking up on the seventh day of the week, the day I usually rest up and relax, it’s a good time to reflect for a moment. In short: I don’t think I’m in such a bad spot as I thought I was in my last post.
First, the sounds:
Self-reflection is inherently confounded, viewed through the murky mist of the ego. We’re perpetually occluded, as Philip K. Dick put it in VALIS.
Thank the gods for that! If we weren’t occluded, if we could perceive everything around us perfectly and see beyond the sphere that defines the everyday, we’d probably go insane from the overload.
I write this not because my head is up my own ass (though it might be). I write this because I’m thinking about the nature of self-reflection, because, in case you’re new to this blog, I like to rant!
The point of all this is to say, my last post may have been a little too pessimistic (surprise, surprise). I’m not in as bad of a spot as I thought I was.
Generally speaking, to a reasonable degree: I know my stuff. I know that much. That’s not to say I “know programming” or “know the web” in an absolute, complete sense, as you might say someone “knows the Tao”, a concept akin to understanding everything about the nature of reality. I don’t comprehend all of it, and never will.
That said: not to brag, but I can code like nobody’s business! And anyone will tell you (especially Dane) that I have a treasure trove of computer science facts, concepts, trivia, related knowledge, and tertiary info stored up in my brain’s database.
Seriously, ask me about cryptography sometime! (Not cryptocurrency as it currently exists – it’s a fascinating concept but the current execution leaves much to be desired.)
Back to the matter at hand: I’m not saying I’m the greatest programmer since Grace Hopper or anything like that, but I try to be great. And my tendency is to strongly understate my ability so, hey, I’ve got to self-promote to some degree! But the point here is more to clarify my previous post, that I’m not as unskilled as I may have sounded. I’m no braggart, I just wanted to balance out the pessimism a bit.
What worries me are the coding problems. The live, high-pressure, time-sensitive challenges…so: I should practice!
My interviewers have provided lists of resources to study, which has been incredibly helpful. As far as books, I have Cracking the Coding Interview, naturally (already had it, actually) and it explains concepts well, though it has a limited number of available problems to solve, so if you’re like me and you take time to warm up with an unfamiliar concept like graph traversal or merge sort…you might run out of problems to solve in a particular section! There’s only maybe a dozen per concept, with some more intermediate and advanced problems in the later sections.
So if you’re screwing up on the earlier problems, and like me, you rush on to the next problem to see if you can solve that…it’s no bueno.
That’s where Leetcode comes in – it’s been an invaluable resource so far. It’s basically Cracking the Coding Interview, but online, with I-don’t-know-how-many problems to solve. I’d definitely recommend using their tools to brush up before an interview.
I also have Introduction to Algorithms, an incredibly dense textbook. I doubt I’ll ever read the entire thing, though it is helpful, when you need to know about a specific algorithm and its detailed characteristics. It also has excellent coverage of time and space requirements, and understanding them, but I’m telling you, this book is denser than Mackinac Island fudge.
The biggest problem I have so far is jumping into a solution, not thinking through the problem thoroughly enough (which is one of the issues I highlighted last time around). This is fixable – “slow is smooth and smooth is fast” – it’s “just” a matter of building the right habit, and breaking the old.
One thing I’ve been practicing is “talking through” a solution, at least in my head (hence the scare quotes). Often I’ll write comments detailing, in pseudocode, how the algorithm I’m making will work.
I think this is like any other area of study: it takes practice and time and discipline to become truly “skilled” in a given domain (10,000 hours, 10 years, or whatever they’re saying these days).
Anyway, back to it! Tune in next time, same bat-time, same bat-channel!