Scientific programming has become increasingly essential for manipulating, visualizing, and interpreting the large volumes of data acquired in earth science research. Yet few discipline-specific instructional approaches have been documented and assessed for their effectiveness in equipping geoscience undergraduate students with coding skills. Here we report on an evidence-based redesign of an introductory Python programming course, taught fully remotely in 2020 in the School of Oceanography at the University of Washington. Key components included a flipped structure, activities infused with active learning, an individualized final research project, and a focus on creating an accessible learning environment. Cloud-based notebooks were used to teach fundamental Python syntax as well as functions from packages widely used in climate-related disciplines. By analyzing quantitative and qualitative data from surveys, online learning platforms, student work, assessments, and a focus group, we conclude that the instructional design facilitated learning and supported self-guided scientific inquiry. Students with less or no prior exposure to coding achieved similar success as peers with more experience, an outcome likely mediated by higher engagement with course resources. We believe that the constructivist approach to teaching introductory programming and data literacy that we present could be broadly applicable across the earth sciences and in other scientific domains.