A method comprising: receiving, at one or more processors, a group of software components , the group of software components comprising code units specified in one or more text-based programming languages, the group of software components together defining a first data processing activity that includes at least one of (a) storing data in storage on non-transitory media, and (b) performing a sequence of steps expressed in the one or more text-based programming languages, wherein the first data processing activity represents a transformation of input data comprising a plurality of data records to output data; processing, by the one or more processors, two or more of the code units specified in the one or more text-based processing languages to form respective dataflow graph representations in a dataflow graph programming language, and identifying one or more data relationships between the two or more of the code units based on a control code unit, different from the two or more of the code units, to control execution of the two or more of the code units; and combining, by the one or more processors, based on the identified data relationships the dataflow graph representations to form a composite dataflow graph in the dataflow graph programming language; wherein the composite dataflow graph defines a second data processing activity representing an equivalent transformation of the input data to the output data, and including at least one type or parallelism from a group consisting of component, data, and pipeline parallelism, the at least one type of parallelism not defined in the first data processing activity. receiving, at one or more processors, a group of software components , the group of software components comprising code units specified in one or more text-based programming languages, the group of software components together defining a first data processing activity that includes at least one of (a) storing data in storage on non-transitory media, and (b) performing a sequence of steps expressed in the one or more text-based programming languages, wherein the first data processing activity represents a transformation of input data comprising a plurality of data records to output data; processing, by the one or more processors, two or more of the code units specified in the one or more text-based processing languages to form respective dataflow graph representations in a dataflow graph programming language, and identifying one or more data relationships between the two or more of the code units based on a control code unit, different from the two or more of the code units, to control execution of the two or more of the code units; and combining, by the one or more processors, based on the identified data relationships the dataflow graph representations to form a composite dataflow graph in the dataflow graph programming language; wherein the composite dataflow graph defines a second data processing activity representing an equivalent transformation of the input data to the output data, and including at least one type or parallelism from a group consisting of component, data, and pipeline parallelism, the at least one type of parallelism not defined in the first data processing activity. <EOS>