A program reads a file for input, and writes to a file for output. To access a device such as, say, a keyboard, the program opens a "device file" that represents the keyboard. When it reads from the device file, the "contents" of the file are the keystrokes of the user. Disks, tape drives, scanners, mice, network connections, and more are all accessed through files.
This may seem strange at first, but the idea that "everything is a file" leads to some powerful consequences. If a program sees user input as a file, then if you make the program read from an actual disk file, you have automatic scripting. Since programs can read from multiple files, they can have multiple users. Since programs can write to multiple files, they can have multiple output devices (screens, printers, network connections, anything).
But the "everything is a file" idea leads to an entirely different approach to computing. You can connect the output of one program to the input of another. Then connect the output of that program to the input of a third, and so on. Unix tends to encourage the use of lots of little tools that add up to big tools. For example, you can run a program that lists all the current users of the system, "pipe" its output to a program that searches for certain names, pipe its output to a program that reformats it to three-column mode, then pipe that output to a printer program that turns it into nicely-rendered PostScript and sends that to a printer.
Arguably Linux is more object-oriented than Windows. Every feature can be manipulated in certain common ways. The most common terminal emulator in Unix is the 'xterm', which provides VT100, ANSI, and other terminal support. Add a modem-dialing program that pipes its output to the input of xterm, and you instantly have a versatile and powerful communication program. There are standalone programs that support ZMODEM, YMODEM, and other dialup protocols - add them to the mix and our communication program can support all types of uploads and downloads. Because you can pipe whatever files you like to the input, it's totally scriptable. In fact, the Linux communication program "Seyon" is constructed in just this manner.
Other things are represented by files, including the operating system itself. Type out the file "/proc/interrupts", and you have a list of the interrupts in use, what they are being used for, and how active they are. And this output can be piped into other programs that can automatically configure the system based on this information.
The Unix way of combining simple tools in popwerful ways through a common means of communication gives a system that is amazingly powerful, flexible, and configurable. It does take some work to learn this new approach, though not as much as you might think. And when you have learned it, you can apply it to anything in the Unix world.