...For those who wish to be a Master.
Find a graveyard 586 computer. You can get such a machine for free (or nearly free) at a computer-repair shop or recycling yard. Make sure the machine has a hard disk light -- it's the last vestige of the old days where computer lights lit up a machine room and will be your sole source of feedback of what the OS is doing with your hardware. Your challenge: make this machine faster than a modern one for common tasks.
Open up the box. Note all the hardware in the machine and remove anything that's obsolete. The fewer the parts, the easier it is for both your hardware and OS to manage. Find out what motherboard you have, CPU model, bus interfaces, video card, RAM type, harddrives and their capacity, IRQ pin settings (if any) for all the hardware, and write it all down. Ensure all cables are secure and all cards are seated properly and then put it back together. Use these datum to retrieve the technical documents from the manufacturer's website. IRQ's interrupt the CPU with whatever its doing and are limited in number. Different hardware should be on a different IRQs. It may not be safe to assume the existing state of the machine is actually sane.
Start up your machine and enter the BIOS setup utility. Note the version of your BIOS. Check all settings to ensure that they match your hardware sheet and are at their optimum for performance. Disable things you don't need. This is called being on the path.
Install Linux (prior to Gnome 3) on your machine. Keep a partition of 100MB for DOS/Windows and one for SWAP that is twice the size of your RAM (found during the memory count at bootup). Command line is going to be your best friend, so consider this before indulging too much in questions about what window manager (Enlightenment, GNOME, KDE, blah blah) you're going to use. The only thing that matters is X. Make two accounts: one for root (the super-user) and one for experimenting.
Customize your GRUB or LILO configuration for dual-boot and install DOS v3.3 or v5.0 if you can. Windows if you want. As you'll find out, you'll need root privileges for making system-wide changes. You find that it's a good habit to stay our of superuser mode so you don't accidently bit-write your whole system.
Understand what your computer is doing. Find out the sequence of events that begins the bootup process once you press the power button. It's going to go something like this: At power-on, the BIOS (consisting of permanent, read-only memory) and CPU work together to bootstrap the process of getting all your hardware "online" (called the Power-On Self-Test). After that, it should read the boot record on your primary boot device and start fetching intructions from there: loading the kernel and starting the Operating System.
Find what programs/daemons are started after boot, called by "init". Use the "ps" command. Understand what each process does, then remove what you know you don't need or use. Check your free memory to see how much progress you're making with each removal ("top" is your friend). Processes always consume some memory and CPU time, even when idle (or "S"uspended). In any case, you want to get a sense of how intensive various tasks are. This is called respecting memory.
Find the assembly code of your BIOS chip and see the point where the core or "kernel" of your operating system actually starts. Yeah, you're going to have to find books for these. Do it. Do it until you understand the relationship between the hardware and the bits that just exist on the page.
Then, when you can see the difference between the kernel and the rest of the operating system running in User Space, customize your kernel and compile it to your exact hardware. You can find these under the linux HOWTO's. This is called treating your hardware well.
Now you are worthy of programming the computer.
First learn C (gcc on linux). C syntax translates into machine code quite cleanly. You don't have to suffer through assembly anymore. Your Operating System is written in it. Make a program to list 100k prime numbers starting from 2, then make one that doesn't output anything, only computes. Learn to use a Profiler Tool, so you understand what makes good code (from the hardware point of view) and what doesn't. These tools are readily and freely available. Use them, they will train your mind not to be a mediocre programmer.
Read up on the history and evolution of the operating system, so you know what questions have been asked and answered. To think about: What are best ways to organize data in memory, store data securely, interface with the user, and prioritize different tasks? This is the arena in which OS's are defined and will refine your system programming chops if you choose that path. But now you can revamp the assumptions for the Internet era, where "The Network Is The Computer": for ex., you don't need giant hard-drives because the internet provides what you need on hand. Replace your hard disk with a 1Gb flash drive and you've just improved the performance of your system by 1000x. Boom.
One last rule: the master programmer relies on the integrity of the file system, without whic,h nothing can be done; so, the master programmer always closes all files that s/he's opened to release all file handles back to the operating system after s/he's done using them. Just like proper memory management, if you don't do it right eventually hard-to-recover bugs will creep in to your software. This is called treating your file system right.
Ultimately, you will find, that Inside the mystery of the box, there is something ultimately simple. The apparent complexity of the machine is/was only for optimizing performance and I/O to be insanely fast. A computer that plays Tic Tac Toe has been made with simple TinkerToys by Danny Hillis of MIT*. Consider that in relation to the rest of your life so that the machine doesn't consume you.
Then find me, I will teach you from here.
Towards building the Perfect System,
Master Of The Machine
* See http://www.retrothing.com/2006/12/the_tinkertoy_c.html, http://www.rci.rutgers.edu/~cfs/472_html/Intro/TinkertoyComputer/TinkerToy.html
- Get a job as a computer technician, repairing and building computers for use in the home or in small businesses. You won't get paid much, but you get exposed to a lot of hardware, some of which you'll be able to nab for little or no cost.
- Build your "deck". Assemble your system, evaluating these primary elements:
- CPU (clock speed, wordsize are the primary elements)
- Main memory (bus width, quantity, and cache sizes)
- Buses (bus width measured in bits, and bus clock)
- Graphics (color depth and resolution)
- Storage options (primarily size and access times are the factor here)
- Collect the best parts that eventually shift through all the mass of parts you'll be exposed to, regardless of how old... Good architecture will use less energy, last longer, and will be able to trade speed for usefulness easily.
- Always use linux. Linux is designed close to the machine and will be able to make best use of all the parts you have and you might even find a way to optimize and contribute to the codebase.
- If you get several boxes you can consider how to use RPC's, Beowolf clustering and such to make yourself a power user. Set up UUCP and even do net news.
- You really owe it to yourself to investigate Bulletin Board Systems, and early network culture. Read "Hackers" by Steven Levy. Check out BYTE magazine, 2600, Phrack, and early Wired for when the Internet culture really got lit.
In any ease, after you assemble your great pieces of hardware and have got linux optimized well (compiled and tuned it to your machine), here's what next:
- You must realize the nature of data -- that it relates to something from the real world, put into the machine. It's not just random bits that only exist for the machine.
- Then, you must realize that since the world is interconnected, that All Data Relates To Other Data -- your windowing system is a crude way to interact with that data. You have a file system which acts somewhat as a neutral mediator between applications.
- Next, you must see that the right environment for such a Data Universe is a Three Dimensional Visualization Model. But then, you ask "how?"
For that, you need the Glass Bead Game.
It has been rumored that finishing NetHack
and retrieving the Amulet of Yendor
will also bring one to Enlightenment.