For a layman, a batch job can be defined as any job that can be run offline. Typically, it will be a manual trigger and the result can be collected after the expected completion time. If all goes well, then it's really cool, but let's list some of the challenges:
What if the external system that is used for a batch job (say an FTP server that hosts files) fails?
If the machine running a batch job is rebooted for some reason, will the batch job also restart?
What if some explicit parameters are required (for example, authentication details that might not be eligible for automation)?
Will incomplete tasks be tried again or left out?
How do we deal with transaction and rollback?
How do we trigger and schedule the job at fixed intervals or in an event-driven fashion?
If the jobs run in a thread, who will manage resource synchronization?
How do we deal with the failures? Can the batch job trigger some alarm or send out notifications?
There are a lot of things that need to be accounted for...