Can you give a self-taught cmputer geek a point to start from to become a REAL computer geek?
July 10, 2007 4:31 PM   Subscribe

Can you point me in the right direction to learn more about machine language and general Computer Science?

I guess I would call myself a "computer literate" person. I might even go as far as to call myself an "advanced user." But there is a lot about some of the fine details of administration and that type of stuff that I just don't know, and I'd really like to learn.

To give some background on the things I know:
Where I teach (University level) I have become the administrator and liaison (for free, and I volunteered) between our department and the IT folk. I can do rebuilds, I install XP and I can install from a network or from a ghost image. I register computers on a network; I troubleshoot connections, set up network resources (printers and shared drives/storage) and I even build my own machines and "tweak" them (pushing the processor, etc). I am comfortable and familiar with commands like "ipconfig" from the command line, and essentially how to do some basic things like ping machines, 'msconfig,' navigating the computer without using a mouse, etc. I can set up a router, flush IP addresses, I constantly use programs that require me to open and close ports on my connection, and I've been troubleshooting family computers since the days of Windows 3.1 - I'm just not "official" in my knowledge of computers, and I've never had any training. For example, I'm studying to take the MCSA, and I'm studying for test 70-270 (XP) right now. The things that give me the most confusion are the things that require command line structure where you're sending commands that require what I would consider "advanced" knowledge - the 'right' steps to take when solving certain problems - the MCSA and MCSE tests seem to be all about the "right" way to do stuff.

My goal here wasn't to write all the things I know how to do - obviously, I don't know everything, and my knowledge of things is limited to what I've read, experienced, researched, or come across in solving a problem. But I can tell you this - when I do things to solve computer problems, I am REALLY SATISFIED and HAPPY. I enjoy this almost as much as my chosen profession - and there is a lot of crossover within my discipline and computer science.

Can you point me in the right direction as to learn more about things like what types of things I need to know about "machine language?" Where should I go (short of taking courses on the subject, which I will be doing in the next year in my spare time) to learn and fill in the basic blanks that I have about Computer Science? I'm sure that the first five courses in CS are the ones where I would be able to do this... but in the mean time, my analytical brain needs a fix.

Thanks in advance, this is very important to me, and I have respect for people who have this knowledge.
posted by jimmyhutch to Computers & Internet (20 answers total) 19 users marked this as a favorite
 
Code by Charles Petzold.
posted by matildaben at 4:53 PM on July 10, 2007


Well, by machine language you might mean assembly. This page has a free book on some basics of programming with some useful information like how binary works, memory, registers, etc. Its like a cliff notes version of cs101.
posted by damn dirty ape at 4:55 PM on July 10, 2007


Best answer: A small tip: be careful with your terminology. I gather from you post that you intend the phrase "machine language" to mean a programming language, but you're probably thinking of something high-level (that is, readable to some extent by a lay-person). "Machine language" carries the implication of consisting of the low-level type of commands that might be immediately recognizable by the raw hardware of a computer (assembly language).

It sounds like you're fairly aware of the fact that your knowledge is currently more representative of what people in the IT profession learn, as opposed to those in the field of computer science (as far as that can be said to exist as a singular entity). Beyond that, you should be aware of the fact that even within the programming world, there is a conceptual division between those who write code on a practical level and those who invent new solutions to existing problems, usually in the form of new algorithms and often on a very abstract level. The second group is generally well-versed in the formal aspects of computer science: discrete math, algorithms, etc. The former is generally not. A recent slashdot article talked about how computer science, as a discipline, is essentially a subset of general mathematics concerned with computable scenarios. This is essentially correct, though any CS major worth his or her salt has a solid foundation of practical knowledge.

The practical knowledge is fairly easy to gain via books and websites, and I'll leave it to others to post some good online resources for that, as I don't have any at hand right now. The mathematics of CS are generally found in expensive textbooks, and aren't the type of thing you'll find a casual introduction to online. That may or may not be a problem for you, depending on what you're interested in.

Either way, good luck! It's a fascinating and seductive field (at least for me), and hopefully you'll find the more abstract mathematics of it as beautiful as I do, as a CS major. :)
posted by invitapriore at 5:02 PM on July 10, 2007


There are some training chips you might want to play around around with. And I think you can still get so-called programmer training kits -- like those old boards that had hexadecimal LED readouts and you can learn about the cpu on board, plug things into registers and memory. That would teach you quite a bit. I wish I had specific examples, but I don't. :-(

Another thought is to go retro. Say, find a Commodore 64 or an Atari and learn about assembly/machine on the 6502(c), which is an older chip and might be easier to grasp. This is what I'd probably do if I had any discipline! ;-)
posted by tcv at 5:02 PM on July 10, 2007


Best answer: Well, "machine language" isn't what you likely think it is, and it's probably a poor place to start unless you have a desire to do some very close-to-the-machine programming; if your desire is to program, "machine language" (that is, assembly) will likely teach you bad programming habits. (Note that assembly, especially ARM can be pretty fun, but in a lot of ways it's more like doing a Sudoku puzzle than programming in higher level languages.)

If your desire is to learn general programming, go to your university's bookstore, and get the assigned 100 or 200 level book on algorithms and data structures. You can learn quite a but by understanding some of the fundamental data structures that are used over and over and over in all programming, i.e., Lists, Dequeues, and Trees.

If you're looking to learn a particular language -- and you probably shouldn't be, at this point--, check the usenet group for that language, and find the group's FAQ. It will list several language specific books for beginners. For C, get K&R; for C++, Koenig and Moo's Accelerated C++, then Stroustrup's The C++ Programming Language. If you're enough of an autodidact, the exercises in those bnooks will give you a good working knowledge -- but you should leaven that with a book on algorithms and data structures.

It's not really clear to me what you want to do or learn. But really, the thing to do is to both jump in and program and understand the underlying theory. Don't ignore either side; there are too many people who have learned just enough to be dangerously ignorant without realizing the extent of their misconceptions. Which reminds me: whatever you do, never read anything by Herb Schildt, except to laugh at it.
posted by orthogonality at 5:08 PM on July 10, 2007 [1 favorite]


I am (I guess) a professional software developer who gets to work on really cool things in a lot of different programming languages.

I don't have a CS degree, I have no formal training, I am a bit of a nut. The best book I've ever read on the subject - and this has been echoed around the world by people I highly respect - is Structure and Interpretation of Computer Programs. Don't be scared by the excessively dry title; I think they're required to sound like that to be "real" textbooks.

Take a look at it. If you don't find yourself ready for it, keep it on a shelf until you are. But it's pretty much essential.
posted by blacklite at 5:14 PM on July 10, 2007


I'm not sure how your IT leanings are pushing you toward machine language and/or assembly language (god, I remember learning z-80 assembly, and its machine language by osmosis, back around 1980).

I think maybe what you want to start with is a freshman type computer architecture and intro to programming book. There are probably some free online college courses somewhere. Petzold's "Code" mentioned above is probably not a bad starting place either. Intro programming books are mostly java these days, I think. For windows, VB would be more useful though.

If you really want assembly language, I don't have any recommendation. I'd probably pick up an old 8088 assembly language book, I imagine its programs would still run in a DOS box. If you want to learn z-80, a nice little processor, I learned from this.
posted by DarkForest at 5:27 PM on July 10, 2007


I'm a software professional and I have a formal CS background (many CS degrees, and ex-CS-prof), and I'm in complete agreement with blacklite: run, don't walk, to your local college bookstore and get a used copy of Structure and Interpretation of Computer Programs.
posted by phliar at 5:40 PM on July 10, 2007


it sounds to me like you'd be best off learning about the architecture of operating systems, and also of networks from the bottom of th OSI reference model to the top(or vice versa). I think this will give you a frame work for better understanding how the pieces you already know fit together, and where to look and what to ask to learn more.
posted by Good Brain at 7:01 PM on July 10, 2007


This may seem basic, because it's cartoony... but as a web designer with a non-science, non-mathy background, who's married to an ubergeek and deals with programmers / programming / computers pretty much all the time, every time I skim through Larry Gonick's the Cartoon Guide to the Computer, I learn something new and cool. Did you know that jaquard fabric is named for the dude that figured out how to program looms? Also I am slowly picking up binary and the concept of logic gates because of it. It's really a good book for conceptual foundations, and how to hang advanced knowledge on them.
posted by mimi at 7:10 PM on July 10, 2007


You are asking for specifics, so here are three:

1) Bit Slice Microprocessor Design (Mick and Brick)

2) Bit Slice Design - Controllers and ALU (Donnamaie White)

3) Encyclopedia of Computer Science and Engineering (Ralston)

The reason I mention the bit slice stuff is that it delves into the intimate architecture of processors and examines internal subsystems, such as sequencers, adders, ALU's and the like. You can still find copies, but you'll likely be the only one on the planet reading them, and you'll find no help from anyone who hasn't some gray hair or a substantial lack of any hair!

I also found Digital Computer Fundamentals (Bartee) interesting back in the 1980's. Delves into the circuitry of implementing machine math economically, as well as other minutae. It lacks substantial relevance to modern technology since at the time it was written, no flash, ferroRAM, etc. was present, and certainly nothing like multi-core micros. It is a fine tour of how things were once done, however. As I recall, it talks about drum memories, mag tape, maybe some TTL and early CMOS/PMOS/NMOS chips. It does explain how an adder works, and why complement/add is better than making a subtraction circuit.

Any of several 1980's era Osborne publications on specific processors can yield a lot of knowledge of this topic, but as others have said, it's obsolete and I am speaking first hand as someone knowledgeable about how obsolete some of the stuff I know is! You can get a good overview of the evolution of various processor families, and possibly see how persistent some characteristics of them have been. (For instance, once upon a time, there was great technical conflict surrounding Harvard vs. Von Neumann architectures, and this was a divide occupied by Intel and Motorola. Now, who cares?! Nonetheless, x86 chips and Freescale micros contain descendants of this dichotomy to this day, and you'll likely find zero modern CS grads who can appreciate this!)

It is interesting to know what's going on inside chips and computers at the register level, but I think the time for such knowledge is long past. Modern chips have too much silicon to comprehend on this level, and while some knowledge of it is illuminating, it's usually not useful in troubleshooting or software design. The structure of your application at the high level is all that matters these days and studying data structures/algorithms is probably a lot more useful. Computer science is a different beast now, and you might as well study vacuum tubes and relays as digging around a technical attic.
posted by FauxScot at 7:49 PM on July 10, 2007


Response by poster: WOW! I cannot believe how many people answered this question! I sat here reading these answers, and it is obvious that I did not ask the correct questions, but got fantastic answers to the one I DID ask... Lots of these answers wanted to make me have my dad mail me my old Tandy TRS-80 and start goofing in BASIC and COBOL again!

Matildaben, I am going to order and read that book. My wife and I think it looks interesting! As a matter of fact, all of the books on this list are of the calibre for my very macabre library of books on subjects I'd like to know everything about. It was obvious to most of you that the question I should have been asking probably went like this:

If I were to want to know more about the command line and all things associated with it - such as the way and REASON mostly for accessing a network and operating system USING the command line, where would one self-taught geek start? Should I get some books on DOS and learn what a forward slash versus a backslash means? Commands like "-s" and why "\\" starts a location? Where would someone like myself - completely self-taught - go to read up and drink in information like this?

FURTHERMORE:
Can you brilliant folk tell me how much of the wonderful info YOU have provided to learn and the command line/operating system navigation and manipulation information I should plan on studying in order to craft a solid working understanding and ability for manipulation of these computer environments? Invitapriore, you are absolutely correct on me needing to be careful with my terminology! I guess that kinda goes with my ignorance on the intricacies of the subject!

Please keep answering! I've look up ALL of these links and I plan on ordering some of these books!
posted by jimmyhutch at 8:19 PM on July 10, 2007


You don't have to wait till the book arrives in the mail.
posted by Gyan at 9:38 PM on July 10, 2007


Best answer: For starters, you may want to choose an operating system (DOS/Windows, UNIX, maybe Mac OS X which is also UNIX after a fashion).

Not that it's essential to "choose a side" but it's far less confusing if you focus on one for a while. It would appear that Windows is a good choice given your previous experience and your job.

O'Reilly has a bunch of Windows books that would be right up your alley - since O'Reilly started with UNIX books they focus on command-line stuff alot. "Windows XP Pocket Reference" is a good one to start with.

As for the REASON for using the command line, there is only really one good reason in my opinion: To accomplish things the GUI doesn't allow. In reality, as a Windows administrator for years, I've found that I rarely need to use it, and you've probably run across most of the commands I use on Windows (ipconfig, etc.)

For starters, I'd suggest you look for some advanced books on Windows - Yes, advanced. You're actually an advanced user by Windows standards. Anything published by O'Reilly is probably good.

Also, figure out what direction to head in - programming? Network administration? There are lots of choices, and lots of specialties - there are programmers who have no idea how to do what you do with troubleshooting networks, and there are expert network admins who never write a line of code.

(This is also important if you're signing up for classes: CS or IT?)

I'd avoid books with "MCSA" or "MCSE" in the title. They're focused on teaching you the facts (lists of steps, exact commands) that will be in the tests rather than the reasons behind them - and I think you're curious about the bigger picture. Your average MCSE is just like you - they know certain commands that do certain things, not necessarily the deeper reasons behind them. (Trust me, I know.)

Anyway, pick an OS and a rough idea of a discipline, and start playing with it. Set up a network in your house, or just one machine if you want to program.

Volunteer to solve someone's computer problems. When they explain the issue, say "I have no idea why it does that, but I'll find out." Do so. Repeat.

As for BASIC and COBOL - if that sounds interesting, I strongly suggest learning PHP or JavaScript. They're both very logical, straightforward, high-level languages, and you can use them to make web pages.

Good luck! Feel free to email me (see my profile) if you want to ask more questions. You've opened a Pandora's Box here and there will be many more questions. :)
posted by mmoncur at 11:48 PM on July 10, 2007


Any geek worth their salt knows at least a dabbling of linux. Mess around with a Ubuntu LiveCD and learn to love linux and the command line. The windows command line is a much less rich environment. I've been using linux almost exclusively for 3 years and once a week I still find something that makes me say "cool! I didn't know I could do that!"

Also, it sounds like you probably want to learn a little bit of programming. Some others may crucify me for this, but I suggest PHP as a good starting language. It's not a full-featured programming language, but it will allow you to do some simple programming with if/thens and for loops. More importantly, you can build some little web pages and see immediate results. That process can be really gratifying.
posted by chrisamiller at 11:53 PM on July 10, 2007


P.S.

To answer your question in the title of this post, you ARE a real computer geek. That's nothing more than a matter of attitude, and there isn't a test or college course or anything else that us "real computer geeks" have in common. We just have an intense desire to figure out computer stuff and aren't afraid to dig right in and learn it.

[We also have poor social skills. But that's another story.]
posted by mmoncur at 11:53 PM on July 10, 2007 [1 favorite]


Best answer: First of all, jimmy, props for getting where you are. Your current knowledge is valuable and you are already deserving of the term "computer geek". Everyone has there own ideas about what's best to know in the world of computers, and there's some good advice above.

The only thing I would stress, and I cannot emphasise this enough, is that courses are generally ridiculously bad ways to learn about computers. You've said already that what you know has come about through having "read, experienced, researched, solv[ed] a problem" about computers. Tap that vein, plough that furrow. If you want a big fat dent in that passion for computers you have, go on a course by all means. If you want to cultivate that glow you get from cracking a problem get your hands dirty, try for yourself, look it up on the web if you have to, or if you're really floundering get a book out from the library. Follow your interests. You know better what these are, so don't worry about what we think. Don't worry too much about badges or peer approval.

If you do something cool, document it and stick it on the web. Post it on MeFi projects.

But if you want to get into programming Python is a good start. There are any number of programming AskMe threads that attest to this.
posted by nthdegx at 12:42 AM on July 11, 2007


Best answer: For learning about the command line, O'Reilly's "Windows XP in a Nutshell" has a chapter on the command prompt and batch file programming. There's also a chapter on the windows scripting host, another batch programming language for windows.

You may also want to learn about windows powershell., another command line for windows.

To play with the linux/unix command line, you don't need to go full linux, you can just use cygwin. This is a 'bash' command line and set of gnu/linux tools compiled for windows.

Lifehacker.com has an ongoing series of posts about using the command line, usually cygwin. Poke around in their posts with the command line tag.

As to why to use the command line. Part of it is just a preference thing. Sometimes a tool only exists in command line form. I often just find it easier to just type a command with the arguments needed to do what I want, rather than muck around in the windows menus finding the program I want and then mucking around in the program's menus to get it configured to do what I want. The trade off here is that you need to know what arguments the command takes for it to be faster. Otherwise, you're often better off just looking through the gui program's menu of choices.
posted by DarkForest at 4:37 AM on July 11, 2007


When it comes down to it, there are only a few things that a CPU can do:
1. move memory from one place to another
2. perform (limited) arithmetic
3. perform logic operations
4. change program flow
5. activate peripheral devices

Everything I've seen (and I've written code for 15 specific processors) falls into those categories. What's different is how those things are made available to you and what bells and whistles are added in.

There's a great tool available for trying out simple(r) processors. It's called MAME. It emulates many micros and has the added benefit of giving you some graphics and sound hardware (emulated) to play with too. Given an assembler and the tools to create ROM images, you can start writing code for obsolete video game hardware.

My friend and former co-worker, Joe Holt, taught a College Class on Robotron from the inside out.
posted by plinth at 6:48 AM on July 11, 2007


This essay gives a nice 10,000 foot view of some of the cultural issues surrounding CLI vs. GUI, various operating systems, and more.
posted by harmfulray at 2:42 PM on July 11, 2007


« Older Do you miss me yet?   |   I want to save the world ... with my pills. Newer »
This thread is closed to new comments.