Currently Jobs pick dwarves. This means that any intelligent behaviour coming from the dwarves requires a total rewrite of the jobs system, and likely a big slowdown. This is easy to forget.
Assuming the code is compartmentalized in a rational manner, I'm not convinced this is that hard to work around.
(1) There's already a job queue of some sort. Various dwarf choosing proposals are merely going to require a different sorting algorithm. (Btw, the current algorithm appears to be a stack - LIFO - based on queueing up lots of build construction orders and observing which were filled first)
(2) It should only be trying to assign jobs to idle dwarves anyway, which is exactly the trigger we need for the dwarf to want to choose a job.
(3) Currently it has to work through the list to find a suitable job, which is sort of like the dwarf looking for the job. For example, the job stack looks like this:
build wall (iron), cook fine meal, dye cloth, make leather coat,...
A leatherworker becomes idle. The first job tries to claim him and fails. Then the second. Then the third. Finally the fourth job succeeds.
How is that different except in semantic terms than the dwarf looks at the first job, then the second job, etc..., until he finds one he wants?
Basically, searching by job or by dwarf are effectively the same, and any improved jobbing assignment algorithm will either need to retain a memory of some number of jobs (to find a better fit), resort the queue, or both.
-------
If someone would like to explain what the current algorithm is doing to make the above not true, I'd be interested in hearing it. Anything which doesn't boil down to the above does strike me as grossly inefficient and probably in need of a rewrite anyway. (Why waste processor time trying to assign jobs to busy dwarves?)