Several of my peers recently asked how I’ve become knowledgeable about technology. I remember the first time I was asked: I was taken aback and didn’t know how to respond. Even dispensing with modesty, I never thought that I was ahead of any of my peers in this area, given how pervasive technology, and technologists, have become.

I continue to assert strongly that my domain specific knowledge isn’t nearly atypical but in fact is often below par. This is especially true in comparison to the people with whom I surround myself. Though, I have noticed that there are a lot of people here at Columbia who want to know more about technology but don’t really know how to do it. Most people think that an education in computer science will get you there, but learning how to learn aside (which itself is infinitely important), most of the stuff I’ve learned that is practical came from outside of the classroom.

I’ve since been reflecting on what I’ve done to further myself toward becoming a “master of the universe” (a technical term that means to be a domain expert). I’m definitely not there yet and I still have a lot to learn, but the fact is that I am continuing to learn. I force myself to learn. Taking into consideration peers of mine who are even better than I am as well as present and past mentors, here are some suggestions for becoming more aware and knowledgeable about technology. By no means is this authoritative or even deeply experienced advice. I’d be interested to look back at this list in a few years and see what I’d change myself.

  • Ask questions. Lots of them. The point here is: Don't be scared to ask a question. But don't ask questions just to ask a question, unless everyone else is afraid to ask a question. The good questions will come naturally if you're genuinely interested in something. The adage that there are no dumb questions is wrong, dumb questions abound and are annoying, but there are certainly no dumb legitimate questions. I personally have rolled my eyes at every question that was posed simply for gaining attention. On the other hand, I've actively encouraged questions that are in search of knowledge, even if I already knew the answer. Personal anecdote #1. I first interacted with my future uber-boss, Joe, at a panel discussion where I asked him a question. I followed up with him in an email after the talk with a few more questions, asking for references to learn more about his domain of expertise. He saw an opportunity and asked me to lunch to talk about my interests. We seemed to click well and have similar goals, and the rest is history. Personal anecdote #2. I was walking around near the South Street Seaport one day when I saw this tractor trailer that had the APC logo on it and a satellite on top. I walked around it and noticed the telecomm hookups it had. This was not your average bigrig. Even knowing what the company does, I didn't really get why it had a truck parked in the Financial District. I told an executive-looking guy who shortly emerged from the truck who I am and asked what it was. He said, "You're interested in this," brought me inside, and introduced me to the chief engineer of this mobile datacenter project (a precursor even to Project Blackbox) whom I chatted with for a quite a while. It was a fun afternoon being able to geek out in a random location.
  • Read a lot, including books and periodicals. Reading is the key to gaining knowledge and knowledge is power. It may be hard to take the time out of your day to read, what with being surrounded by more dynamic forms of entertainment, but if you're serious in learning, you should be a serious reader. Read lots of dead-tree (meaning with physical pages) books. The first time though, just skim for overarching ideas and skip the details. Gain understanding on what a Linux bottom-half is, but don't worry about knowing the source file they should be in. Figure out how a right outer join differs from an inner join, but don't worry about knowing the implementation-level details of a B*-tree. Once you do this type of skimming, you should be conversational in a technology, you should be able to have a decent conversation with an expert in the field and show him that you know a thing or two. Then, if the book or subject interests you, read for the details. Master the book, read every word, and experiment with what you've learned between chapters. Don't read dozens of chapters at a time or it won't sink in. I often visualize the domains of knowledge I've come into contact with; this visualization takes the form of a long one-sided corridor with lots of doors. The topics I know most about are rooms that are brightly illuminated whose doors are removed and the topics that I know only exist are doors with labels. Whenever I start I new project, I think about this. I think about which doors I'll have to open to explore in order to finish the project. Read lots of periodicals. Once you have a foundation in a particular domain or technology, periodicals are the best way of keeping on top of the goings on of that topic. This is how professionals stay professionals. Start with an accessible magazine, like Linux Journal, which doesn't focus too much on any one thing. Once you get an understanding of the area, you can select something more specific like scientific or technology-specific journals and conferences. Included in periodicals should be electronic sources like Slashdot (for a 10,000ft view; please don't read the comments and definitely don't post any), wikis, and blogs. Get a good RSS reader. Once you amass all of these sources of information, it's far too cumbersome to visit each of these websites. Let the RSS reader do the heavy lifting for you by retrieving articles and presenting them in one place. Set it to poll only every few hours, or else you'll spend all day reading the news. Read a few papers. Scientific papers are how information is transferred from the guy who first thought of it to guys who can think about it more. They represent fresh knowledge, available to use to your advantage. Some of the ideas presented in papers are absolutely infeasible, but others are gold. Papers can be boring and hard to read, but give it enough practice and you'll be read for what matters. Papers are great topics for discussion groups (see below). (For the record, I regularly read Usenix's :login, Linux Journal, ACM Queue, IBM's Journal of Research and Development, Intel's Technology Journal. There are lots of blogs I normally read. I also frequent the proceedings of various conferences, like VLDB, SIGIR, and LISA; I really like reading these papers on the subway.) So read a lot. But, amidst reading, don't forget to practice and investigate what you've read first hand. Look at code from professionals. Write some code, either toy code or a patch (see next two points). Run some queries. Do something.
  • Join projects you're not quite qualified for. Quickly learn the technologies that you need to in order to contribute. This is a fantastic motivator to discover new technologies and new aspects of technologies you're already familiar with. You'll get it wrong sometimes, but with a little exploring, you should be able to find a group that can foster your growth. Be sure to bring the areas of expertise you already do have to the team and use them effectively. Do not constantly join projects where you're fully qualified to do, just to show off.
  • Hack on bugs in a smallish open source project. Look over what open-source software you use and read over the project proposals of the groups participating in Google's Summer of Code. Look at the bug lists of the projects that interest you. Checkout the anonymous code repository and look over some code. Join the project's IRC channel and talk to the developers. (Praise them and say you're interested in helping out). Subscribe to the developers' mailing lists. Then start writing some code. The ideal project will be one where you'll submit patches to the experienced developers and give you valuable feedback on how to make your code better. Less-than-ideal projects will be where you're flamed for being a n00b.
  • Get a good mentor. There are a lot of people out there who are friendly and were once a n00b. But now they're friendly and experienced, which is a powerful combination for anyone starting to get interested in this arena. Ask someone if they'd be okay with looking over your code once in a while or talk about the industry and emerging technologies. Go out to lunch and talk about the journal you read last week. Discuss the patch you submitted on IRC.
  • Form/Join a discussion group. I really like this idea of peers teaching a peer group. Each week, say, one member takes a turn presenting a paper or concept from a book (that they've already meticulously read) to the rest of the group. Each person presents something that interests them. There's a lot of opportunity to learn about a diverse number of topics. About a year ago, a student here set up the Mainframe Interest Group, a weekly meeting of geeks to learn about an aged and often overlooked major technology. I didn't appreciate it as much as I should have and consequently wasn't as active in it as I should have been. Today, I sit in on the Database Research Group where some really cool, really smart graduate students and professors talk about current research in their field.
  • Learn how to speak and write well in order to interact with people. A technologist is not some isolated coder sitting in the basement. A technologist grasps the role of technology and its interaction with its environment. He needs to convince others of its promise. This persuasion requires great communication skills, skills where surprising many people fail, and skills that are not listed on resumes (but should be if only there were a metric for it). Read Dale Carnegie's books. For real practice, go participate in a discussion, join Toastmaster, or give a presentation to your peers. At university, don't shy away from humanities classes that are reading- and writing-based. Take some non-required classes in a humanities subject in which you're interested (mine is art history) and take the assignments seriously. Take some seminars that are discussion-based, participate often, and don't sit in the back row.
  • Meet as many people as possible. The more people you meet the more interesting people you talk to, the more interesting you get. N.B.: Interesting does not necessarily equal famous.
  • Finally, Stand out. Disagree sometimes. Do stuff. No one ever got to be important by agreeing with everyone. Don't be scared of confrontation when it's called for. Actually go out and be productive.

(Jeff Atwood just published an extremely similar article to this one. He links to another similarly good piece by Rob Walling. If this pertained to you, read those too.)