On typical Linux-based systems, the /dev directory is used to store file-like device nodes which refer to certain devices in the system. Each node points to a part of the system (a device), which might or might not exist.
Userspace applications can use these device nodes to interface with the systems hardware, for example, the X server will “listen to” /dev/input/mice so that it can relate the user's mouse movements to moving the visual mouse pointer.
The original /dev directories were just populated with every device that might possibly appear in the system. /dev directories were typically very large because of this. devfs came along to provide a more manageable approach but is replaced by udev to clear up some issues with previous implementations.