Data-driven programming can probably have different meanings, but here is the one I use it for: it is a style of programming in which specialization is done through data structures and not boilerplate code. Examples are probably a better way to understand the concept. Instead of writing (pseudocode): DoSomething(a,b) DoSomething(c,d) DoSomething(e,f) You write: things_to_do = [ [a,b], [c,d], [e,f] ] for each thing in things_to_do DoSomething(thing) If you have first-class functions, instead of writing: switch x case a f(y) case b g(y) You write: switch = { a: f, b: g} switch[x](y) Now, more realistic examples. This one is extracted from a Ruby library I wrote, and it makes some methods defined on Arrays work on Strings. I think it illustrates the power of data-driven programming coupled with metaprogramming quite well. methods = %w{first first= head head= init last last= tail} methods.each{|n| define_method(n){|*a,&b| chars.to_a.send(n,*a,&b).join}} If you prefer C, an excellent example is the way Redis commands are defined: see the "Globals" section of https://github.com/antirez/redis/blob/master/src/redis.c.