Programming seems susceptible to a similar bottom-up teaching approach as I think would work best in statistics; there are a lot of busywork details in each (syntax of different language constructs, or details of different types of tests) which students memorize more than understand, and which can be avoided if you strip the course down to its core concepts (sampling variation and the logic of inference, or basic computing with functions and minimal syntax).
How to Design Programs is the embodiment of this idea for introductory computer science. It starts in Beginning Student Language, a restricted subset of Racket which has minimal syntax designed to prevent the most common student mistakes. The language has basically no features; instead, students work on structuring programs, understanding how to work with data, building data structures, and so on. Remembering where to put the curly braces and semicolons is completely beside the point, so the language doesn’t have any.
See also Statistical programming languages for an attempt to apply these concepts through the language used in an early statistics class.
Felleisen, M., Findler, R. B., Flatt, M., & Krishnamurthi, S. (2004). The structure and interpretation of the computer science curriculum. Journal of Functional Programming, 14(4), 365–378. doi:10.1017/S0956796804005076. http://www.journals.cambridge.org/abstract_S0956796804005076
A review of the HtDP curriculum and an explanation of why SICP (see also the beautiful HTML5 edition), supposedly the classic choice for this approach to programming, missed the mark. I think statistics could use a similar rethink of the intro curriculum.
Ramsey, N. (2014). On teaching How to Design Programs: observations from a newcomer. ACM SIGPLAN Notices, 49(9), 153–166. doi:10.1145/2628136.2628137. http://dl.acm.org/citation.cfm?doid=2628136.2628137
[To read] St-Amour, V., Feltey, D., Florence, S. P., You, S.-H., & Findler, R. B. (2017). Herbarium Racketensis: A Stroll through the Woods. Proceedings of the ACM on Programming Languages, 1(1). doi:10.1145/3110245
An implementation of Lindenmayer systems, a simple rewriting rule system, in Racket. By assigning each term in the output to an action, such as turtle graphics, we can build complex systems entirely from rewriting – like structures that look a lot like trees or ferns. And with a really clever Racket implementation on DAGs, we can do it in constant space and a cute DSL with full support from DrRacket.