I can schedule a job via Apex code:
System.schedule('test', '0 0 0 * * ?', new SchedulableClass());
The CronTrigger job doesn't have a "Name" field, so I can't query for the Job I just created. This means I can't check to see if my job already exists calling System.schedule(); instead I just have to call "schedule()" and silently eat the exception it throws if the job already exists.
The only way you can figure out which CronTrigger is yours is to cache the return value of System.schedule(), which (it so happens) is the ID of the CronTrigger that is created. However, you can't delete them from Apex:
Id jobid = System.schedule('test', '0 0 0 * * ?', new SchedulableClass());
delete new CronTrigger(Id = jobid);
// 'delete' throws 'DML not allowed on CronTrigger'
So the current state of Scheduled Jobs is:
You can create them from Apex Code, but not from the UI
You can delete them from the UI, but not from Apex Code
I guess that just seems odd to me. Why did Salesforce create this whole new API (System.schedule()), with a seemingly random assortment of ways to manipulate it, instead of just exposing the CronTrigger table directly to the full range of DML operations?
Placing new functionality into new core objects, rather than new APIs, seems easier on everyone (the whole describe/global describe suite of API calls are an example of something that seems a natural fit for a set of read-only custom objects).