Abstract
Software developers solve a diverse and wide range of problems. While software engineering research often focuses on tools to support this problem solving, the strategies that developers use to solve problems are at least as important. In this paper, we offer a novel approach for enabling developers to follow explicit programming strategies that describe how an expert tackles a common programming problem. We define explicit programming strategies, grounding our definition in prior work both within software engineering and in other professions which have adopted more explicit procedures for problem solving. We then present a novel notation called Roboto and a novel strategy tracker tool that explicitly represent programming strategies and frame executing strategies as a collaborative effort between human abilities to make decisions and computer abilities to structure process and persist information. In a formative evaluation, 28 software developers of varying expertise completed a design task and a debugging task. We found that, compared to developers who are free to choose their own strategies, developers given explicit strategies experienced their work as more organized, systematic, and predictable, but also more constrained. Developers using explicit strategies were objectively more successful at the design and debugging tasks. We discuss the implications of Roboto and these findings, envisioning a thriving ecosystem of explicit strategies that accelerate and improve developers’ programming problem solving.
Similar content being viewed by others
References
Abbott K., Bogart C., Walkingshaw E. (2015) Programs for people: What we can learn from lab protocols. In: Symposium on visual languages and human-centric computing (VL/HCC), pp 203–211
Ames C., Archer J. (1988) Achievement goals in the classroom: Students’ learning strategies and motivation processes. J Educ Psychol 80(3):260
Anderson J. R., Conrad F. G., Corbett A. T. (1989) Skill acquisition and the lisp tutor. Cogn Sci 13(4):467–505
Bass L., Clements P., Kazman R. (2012) Software Architecture in Practice, 3rd edn. Addison-Wesley Professional, Boston
Beck K., Beedle M., Van Bennekum A., Cockburn A., Cunningham W., Fowler M., Grenning J., Highsmith J., Hunt A., Jeffries R. et al (2001) Manifesto for agile software development
Beck K. (2003) Test-driven development: by example. Addison-Wesley Professional, Boston
Bielaczyc K., Pirolli P. L., Brown A. L. (1995) Training in self-explanation and self-regulation strategies: Investigating the effects of knowledge acquisition activities on problem solving. Cogn Instruct 13(2):221–252
Bird C., Nagappan N., Devanbu P., Gall H., Murphy B. (2009) Does distributed development affect software quality? an empirical case study of windows vista. In: Proceedings of the 31st international conference on software engineering. IEEE Computer Society, pp 518–528
Böhme M., Soremekun E. O., Chattopadhyay S., Ugherughe E., Zeller A. (2017) Where is the bug and how is it fixed? an experiment with practitioners. In: European software engineering conference and symposium on the foundations of software engineering (ESEC/FSE), pp 117–128
Bransford J. D., Brown A. L., Cocking R.R et al (2000) How people learn, vol 11. National academy press, Washington
Ċalıṡkan S, Selċuk GS, Erol M (2010) Effects of the problem solving strategies instruction on the students’ physics problem solving performances and strategy usage. Procedia-Soc Behav Sci 2(2):2239–2243
Chen W. F., Liew J. R. (2002) The civil engineering handbook. CRC Press, Boca Raton
Chi M. T. (1997) Quantifying qualitative analyses of verbal data: a practical guide. J Learn Sci 6(3):271–315
Davies S. P. (1993) Models and theories of programming strategy. Int J Man-Mach Stud 39(2):237–267
Desoete A., Roeyers H., Buysse A. (2001) Metacognition and mathematical problem solving in grade 3. J Learn Disabil 34(5):435–447
Dieste O., Aranda A. M., Uyaguari F., Turhan B., Tosun A., Fucci D., Oivo M., Juristo N. (2017) Empirical evaluation of the effects of experience on code quality and programmer productivity: an exploratory study. ESE, pp 1–86
Einstein G. O., McDaniel M. A. (1990) Normal aging and prospective memory. J Exper Psychol Learn Memory Cogn 16(4):717
Falessi D., Cantone G., Kazman R., Kruchten P. (2011) Decision-making techniques for software architecture design: A comparative survey. ACM Comput Surv 43(4):33:1–33:28
Falkner K., Vivian R., Falkner N. J. (2014) Identifying computer science self-regulated learning strategies. In: Conference on innovation & technology in computer science education, pp 291–296
Felleisen M. (2001) How to design programs: an introduction to programming and computing. MIT Press, Cambridge
Francel M. A., Rugaber S. (2001) The value of slicing while debugging. Sci Comput Program 40(2-3):151–169
Frick T., Reigeluth C. (1999) Formative research: A methodology for creating and improving design theories. Instructional-design theories. Lawrence Erlbaum Associates, Hillsdale, pp 633–652
Gamma E., Helm R., Johnson R., Vlissides J. (1995) Design Patterns: Elements of Reusable Object-oriented Software. Addison-wesley, Boston
Gawande A., Lloyd J. B. (2010) The checklist manifesto: How to get things right, vol 200. Metropolitan Books, New York
Gilmore D. (1990) Expert programming knowledge: a strategic approach. In: Psychology of programming. Academic Press, London, pp 223–234
Gilmore D. J. (1991) Models of debugging. Acta Psychol 78(1):151–172
Haidry SEZ, Falkner K, Szabo C (2017) Identifying domain-specific cognitive strategies for software engineering. In: Conference on innovation and technology in computer science education (SIGCSE), pp 206–211
Hammer D., Berland L. K. (2014) Confusing claims for data: a critique of common practices for presenting qualitative research on learning. J Learn Sci 23(1):37–46
Hilton J. F. (1996) The appropriateness of the wilcoxon test in ordinal data. Stat Med 15(6):631–645
Horvitz E. (1999) Principles of mixed-initiative user interfaces. In: Conference on human factors in computing systems (CHI), pp 159–166
Hutchins E. (1995) Cognition in the wild. MIT Press, Cambridge
Kerievsky J. (2004) Refactoring to patterns. Pearson Higher Education, London
Kersten M., Murphy G. C. (2006) Using task context to improve programmer productivity. In: Foundations of software engineering (FSE), pp 1–11
Ko A. J., Myers B. A. (2004) Designing the whyline: a debugging interface for asking questions about program behavior. In: Conference on human factors in computing systems (CHI), pp 151–158
Ko A. J., Myers B. A. (2005) A framework and methodology for studying the causes of software errors in programming systems. J Vis Lang Comput 16(1-2):41–84
Ko A. J., DeLine R., Venolia G. (2007) Information needs in collocated software development teams. In: ICSE, pp 344–353
Ko A. J., Myers B. A. (2009) Finding causes of program output with the java whyline. In: Conference on human factors in computing systems (CHI). ACM, pp 1569–1578
Ko A. J., Latoza T. D., Burnett M. M. (2015) A practical guide to controlled experiments of software engineering tools with human participants. ESE 20(1):110–141
Ko A. J., LaToza T. D., Hull S., Ko E. A., Kwok W., Quichocho J., Akkaraju H., Pandit R. (2019) Teaching explicit programming strategies to adolescents. In: Symposium on computer science education (SIGCSE), pp 469–475
Ko A. J., Myers B. (2010) Extracting and answering why and why not questions about java program output. Trans Softw Eng Methodol (TOSEM) 20(2):4
Labouvie-Vief G., Gonda J. N. (1976) Cognitive strategy training and intellectual performance in the elderly. J Gerontol 31(3):327–332
LaToza T. D., Garlan D., Herbsleb J. D., Myers B. A. (2007) Program comprehension as fact finding. In: European software engineering conference and symposium on the foundations of software engineering (ESEC/FSE), pp 361–370
Li P. L., Ko A. J., Zhu J. (2015) What makes a great software engineer?. In: ICSE, pp 700–710
Locke E. A., Frederick E., Lee C., Bobko P. (1984) Effect of self-efficacy, goals, and task strategies on task performance. J Appl Psychol 69(2):241
Loksa D., Ko A. J. (2016a) The role of self-regulation in programming problem solving process and success. In: Conference on international computing education research (ICER), pp 83–91
Loksa D., Ko A. J., Jernigan W., Oleson A., Mendez C. J., Burnett M. M. (2016b) Programming, problem solving, and self-awareness: effects of explicit guidance. In: Conference on human factors in computing systems (CHI), pp 1449–1461
Fowler M, Beck K, Brant J, Opdyke W, Roberts D (1999) Refactoring: Improving the design of existing code. Addison-wesley Longman Publishing co., Inc., Boston
McCartney R., Eckerdal A., Mostrom J. E., Sanders K., Zander C. (2007) Successful students’ strategies for getting unstuck. In: Conference on innovation and technology in computer science education, pp 156–160
Mernik M., Heering J., Sloane A. M. (2005) When and how to develop domain-specific languages. ACM Comput Surv 37(4):316–344
Metzger R. C. (2004) Debugging by thinking: A multidisciplinary approach. Digital Press
Murphy L., Lewandowski G., McCauley R., Simon B., Thomas L., Zander C. (2008) Debugging: The good, the bad, and the quirky – a qualitative analysis of novices’ strategies. In: Symposium on computer science education (SIGCSE), pp 163–167
Pothier G., Tanter É (2009) Back to the future: Omniscient debugging. IEEE Software 26(6)
Quinn A. J., Bederson B. B. (2011) Human computation: a survey and taxonomy of a growing field. In: Conference on human factors in computing systems (CHI), pp 1403–1412
Reason J. (1990) Human error. Cambridge University Press. https://doi.org/10.1017/CBO9781139062367
Retelny D., Bernstein M. S., Valentine M. A. (2017) No workflow can ever be enough: How crowdsourcing workflows constrain complex work. Proc. ACM Hum.-Comp. Interact 1
Rist R. S. (1995) Program structure and design. Cogn Sci 19(4):507–561
Robillard M. P., Coelho W., Murphy G. C. (2004) How effective developers investigate source code: an exploratory study. Trans Softw Eng 30(12):889–903
Robins A., Rountree J., Rountree N. (2003) Learning and teaching programming: a review and discussion. Comput Sci Educ 13(2):137–172
Roehm T., Tiarks R., Koschke R., Maalej W. (2012) How do professional developers comprehend software?. In: International conference on software engineering (ICSE), pp 255–265
Sackman H., Erikson W. J., Grant E. E. (1968) Exploratory experimental studies comparing online and offline programming performance. Commun ACM (CACM) 11 (1):3–11
Salinger S., Prechelt L. (2013) Understanding Pair Programming: The Base Layer. BoD–Books on Demand
Schoenfeld A. H. (1981) Episodes and executive decisions in mathematical problem solving. In: Annual meeting of the american educational research association. ERIC
Sears A., Jacko J. A. (2007) The human-computer interaction handbook: fundamentals, evolving technologies and emerging applications. CRC Press, Boca Raton
Shaw M., Garlan D. (1996) Software architecture: Perspectives on an emerging discipline. Prentice-hall, Upper Saddle River
Shull F., Melnik G., Turhan B., Layman L., Diep M., Erdogmus H. (2010) What do we know about test-driven development? IEEE Softw 27(6):16–19
Sillito J., Murphy G. C., De Volder K. (2008) Asking and answering questions during a programming change task. IEEE Trans Softw Eng 34(4):434–451
Simon H. A. (1972) Theories of bounded rationality. Decis Organ 1(1):161–176
Suchman L. A. (1987) Plans and situated actions: The problem of human-machine communication. Cambridge University Press
Von Mayrhauser A., Vans A. M. (1995) Program comprehension during software maintenance and evolution. Computer 28(8):44–55
Wieringa D., Moore C., Barnes V. (1998) Procedure writing: principles and practices. IEEE
Xie B., Nelson G. L., Ko A. J. (2018) An explicit strategy to scaffold novice program tracing. In: Symposium on computer science education (SIGCSE), pp 344–349
Zamli K. Z. (2001) Process modeling languages: a literature review. Malay J Comput Sci 14(2):26–37
Zeller A. (2009) Why programs fail: a guide to systematic debugging. Elsevier, Amsterdam
Zhang J., Norman D. A. (1994) Representations in distributed cognitive tasks. Cogn Sci 18(1):87–122
Acknowledgements
We thank our study participants for their time. This work was supported in part by the National Science Foundation under grants CCF-1703734 and CCF-1703304.
Author information
Authors and Affiliations
Corresponding author
Additional information
Communicated by: Alexander Serebrenik
Publisher’s note
Springer Nature remains neutral with regard to jurisdictional claims in published maps and institutional affiliations.
Rights and permissions
About this article
Cite this article
LaToza, T.D., Arab, M., Loksa, D. et al. Explicit programming strategies. Empir Software Eng 25, 2416–2449 (2020). https://doi.org/10.1007/s10664-020-09810-1
Published:
Issue Date:
DOI: https://doi.org/10.1007/s10664-020-09810-1