If you want separate columns, rather than a single comma-separated column, you could use a pivot. From 11g there is a built in pivot command; or you can do it the old-fashioned way:
SELECT program,
MAX(CASE WHEN pos = 1 THEN unit END) AS unit1,
MAX(CASE WHEN pos = 2 THEN unit END) AS unit2,
MAX(CASE WHEN pos = 3 THEN unit END) AS unit3,
MAX(CASE WHEN pos = 4 THEN unit END) AS unit4
FROM (
SELECT program.id as program_id,
program.program_title as program,
course_module.title as unit,
row_number() over (partition by program.id
order by course_module.title) as pos
FROM program_module
INNER JOIN program
ON program_module.program_id = program.id
INNER JOIN course_module
ON program_module.course_module_id = course_module.id
)
group by program_id, program
order by program;
Either way you need to know how many modules are possible, and have handling for them all (adding more case statements with this version).
SQL Fiddle.