Blog

By Topic

academia anecdote aosa book-reviews career
community conferences data-science diversity education
ethics favorite fiction humanities-writing humor
management noticed open-source opinion personal
politics programming proposal research retro
software-carpentry software-engineering student-projects technical-writing workshops

By Year

2020 2021 2022 2023 2024 2025 2026
2010 2011 2012 2013 2014 2015 2016 2017 2018 2019
2004 2005 2006 2007 2008 2009

Recent

What Else Should I Read?

I would be very grateful for pointers to other recent empirical studies of the impact of AI on programming education that are more rigorous than the gushing slop being tossed around on LinkedIn. I’d be particularly grateful for studies that show negative or neutral results.

download the .bib file

@article{Abdulla2024,
  title = {Using ChatGPT in Teaching Computer Programming and Studying its Impact on Students Performance},
  volume = {22},
  ISSN = {1479-4403},
  url = {http://dx.doi.org/10.34190/ejel.22.6.3380},
  DOI = {10.34190/ejel.22.6.3380},
  number = {6},
  journal = {Electronic Journal of e-Learning},
  publisher = {Academic Conferences and Publishing International Ltd},
  author = {Abdulla, Shubair and Ismail, Sameh and Fawzy, Yasser and Elhag, Abdelrahman},
  year = {2024},
  month = Oct,
  pages = {66–81}
}

@article{Abouelenein2025,
  title = {The R5E pattern: can artificial intelligence enhance programming skills development?},
  volume = {30},
  ISSN = {1573-7608},
  url = {http://dx.doi.org/10.1007/s10639-025-13616-3},
  DOI = {10.1007/s10639-025-13616-3},
  number = {15},
  journal = {Education and Information Technologies},
  publisher = {Springer Science and Business Media LLC},
  author = {Abouelenein, Yousri Attia Mohamed and Ghazala, Ayat Fawzy Ahmed and Mahdy, Eman Mahdy Mohamed and Khalaf, Mohamed Hassan Ragab},
  year = {2025},
  month = June,
  pages = {22177–22205}
}

@inproceedings{Adeeb2025,
  title = {How Do Novice Programmers Solve Code-Tracing Problems When ChatGPT Is Available? A Qualitative Analysis},
  author = {Adeeb, Elmira and Muldner, Kasia},
  booktitle = {Proceedings of the 2025 ACM Conference on International Computing Education Research V.1},
  publisher = {ACM},
  year = {2025},
  month = Aug,
  pages = {421–434},
  DOI = {10.1145/3702652.3744207},
  url = {https://doi.org/10.1145/3702652.3744207}
}

@article{Akapnar2024,
  title = {AI chatbots in programming education: guiding success or encouraging plagiarism},
  volume = {4},
  ISSN = {2731-0809},
  url = {http://dx.doi.org/10.1007/s44163-024-00203-7},
  DOI = {10.1007/s44163-024-00203-7},
  number = {1},
  journal = {Discover Artificial Intelligence},
  publisher = {Springer Science and Business Media LLC},
  author = {Akçapınar, Gökhan and Sidan, Elif},
  year = {2024},
  month = Nov 
}

@article{Alanazi2025a,
  title = {PyChatAI: Enhancing Python Programming Skills—An Empirical Study of a Smart Learning System},
  volume = {14},
  ISSN = {2073-431X},
  url = {http://dx.doi.org/10.3390/computers14050158},
  DOI = {10.3390/computers14050158},
  number = {5},
  journal = {Computers},
  publisher = {MDPI AG},
  author = {Alanazi, Manal and Soh, Ben and Samra, Halima and Li, Alice},
  year = {2025},
  month = Apr,
  pages = {158}
}

@article{Alanazi2025b,
  title = {Examining the Influence of AI on Python Programming Education: An Empirical Study and Analysis of Student Acceptance Through TAM3},
  volume = {14},
  ISSN = {2073-431X},
  url = {http://dx.doi.org/10.3390/computers14100411},
  DOI = {10.3390/computers14100411},
  number = {10},
  journal = {Computers},
  publisher = {MDPI AG},
  author = {Alanazi, Manal and Li, Alice and Samra, Halima and Soh, Ben},
  year = {2025},
  month = Sept,
  pages = {411}
}

@inproceedings{Azaiz2024,
  title = {Feedback-Generation for Programming Exercises With GPT-4},
  author = {Azaiz, Imen and Kiesler, Natalie and Strickroth, Sven},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {31–37},
  DOI = {10.1145/3649217.3653594},
  url = {https://doi.org/10.1145/3649217.3653594}
}

@inproceedings{Benario2025,
  title = {Unlocking Potential with Generative AI Instruction: Investigating Mid-level Software Development Student Perceptions, Behavior, and Adoption},
  author = {Benario, Jamie Gorson and Marroquin, Jenn and Chan, Monica M. and Holmes, Ernest D.V. and Mejia, Daniel},
  booktitle = {Proceedings of the 56th ACM Technical Symposium on Computer Science Education V. 1},
  publisher = {ACM},
  year = {2025},
  month = Feb,
  pages = {395–401},
  DOI = {10.1145/3641554.3701859},
  url = {https://doi.org/10.1145/3641554.3701859}
}

@article{Haindl2024,
  title = {Does ChatGPT Help Novice Programmers Write Better Code? Results From Static Code Analysis},
  volume = {12},
  ISSN = {2169-3536},
  url = {http://dx.doi.org/10.1109/ACCESS.2024.3445432},
  DOI = {10.1109/access.2024.3445432},
  journal = {IEEE Access},
  publisher = {Institute of Electrical and Electronics Engineers (IEEE)},
  author = {Haindl, Philipp and Weinberger, Gerald},
  year = {2024},
  pages = {114146–114156}
}

@article{Jing2024,
  title = {What factors will affect the effectiveness of using ChatGPT to solve programming problems? A quasi-experimental study},
  volume = {11},
  ISSN = {2662-9992},
  url = {http://dx.doi.org/10.1057/s41599-024-02751-w},
  DOI = {10.1057/s41599-024-02751-w},
  number = {1},
  journal = {Humanities and Social Sciences Communications},
  publisher = {Springer Science and Business Media LLC},
  author = {Jing, Yuhui and Wang, Haoming and Chen, Xiaojiao and Wang, Chengliang},
  year = {2024},
  month = Feb 
}

@article{Jost2024,
  title = {The Impact of Large Language Models on Programming Education and Student Learning Outcomes},
  volume = {14},
  ISSN = {2076-3417},
  url = {http://dx.doi.org/10.3390/app14104115},
  DOI = {10.3390/app14104115},
  number = {10},
  journal = {Applied Sciences},
  publisher = {MDPI AG},
  author = {Jošt, Gregor and Taneski, Viktor and Karakatič, Sašo},
  year = {2024},
  month = May,
  pages = {4115}
}

@inproceedings{Kazemitabaar2024,
  series = {CHI’24},
  title = {CodeAid: Evaluating a Classroom Deployment of an LLM-based Programming Assistant that Balances Student and Educator Needs},
  url = {http://dx.doi.org/10.1145/3613904.3642773},
  DOI = {10.1145/3613904.3642773},
  booktitle = {Proceedings of the CHI Conference on Human Factors in Computing Systems},
  publisher = {ACM},
  author = {Kazemitabaar, Majeed and Ye, Runlong and Wang, Xiaoning and Henley, Austin Zachary and Denny, Paul and Craig, Michelle and Grossman, Tovi},
  year = {2024},
  month = May,
  pages = {1–20},
  collection = {CHI ’24}
}

@article{Kosar2024,
  title = {Computer Science Education in ChatGPT Era: Experiences from an Experiment in a Programming Course for Novice Programmers},
  volume = {12},
  ISSN = {2227-7390},
  url = {http://dx.doi.org/10.3390/math12050629},
  DOI = {10.3390/math12050629},
  number = {5},
  journal = {Mathematics},
  publisher = {MDPI AG},
  author = {Kosar, Tomaž and Ostojić, Dragana and Liu, Yu David and Mernik, Marjan},
  year = {2024},
  month = Feb,
  pages = {629}
}

@inproceedings{Koutcheme2024,
  title = {Open Source Language Models Can Provide Feedback: Evaluating LLMs' Ability to Help Students Using GPT-4-As-A-Judge},
  author = {Koutcheme, Charles and Dainese, Nicola and Sarsa, Sami and Hellas, Arto and Leinonen, Juho and Denny, Paul},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {52–58},
  DOI = {10.1145/3649217.3653612},
  url = {https://doi.org/10.1145/3649217.3653612}
}

@inproceedings{Liu2024,
  title = {Can Small Language Models With Retrieval-Augmented Generation Replace Large Language Models When Learning Computer Science?},
  author = {Liu, Suqing and Yu, Zezhu and Huang, Feiran and Bulbulia, Yousef and Bergen, Andreas and Liut, Michael},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2024},
  month = July,
  pages = {388–393},
  DOI = {10.1145/3649217.3653554},
  url = {https://doi.org/10.1145/3649217.3653554}
}

@inbook{Ma2024,
  title = {Enhancing Programming Education with ChatGPT: A Case Study on Student Perceptions and Interactions in a Python Course},
  ISBN = {9783031643156},
  ISSN = {1865-0937},
  url = {http://dx.doi.org/10.1007/978-3-031-64315-6_9},
  DOI = {10.1007/978-3-031-64315-6_9},
  booktitle = {Artificial Intelligence in Education. Posters and Late Breaking Results, Workshops and Tutorials, Industry and Innovation Tracks, Practitioners, Doctoral Consortium and Blue Sky},
  publisher = {Springer Nature Switzerland},
  author = {Ma, Boxuan and Chen, Li and Konomi, Shin’ichi},
  year = {2024},
  pages = {113–126}
}

@inproceedings{Padurean2026,
  title = {Interleaving Natural Language Prompting with Code Editing for Solving Programming Tasks with Generative AI Models},
  author = {Pădurean, Victor-Alexandru and Gotovos, Alkis and Ghosh, Ahana and Denny, Paul and Leinonen, Juho and Luxton-Reilly, Andrew and Prather, James and Singla, Adish},
  booktitle = {Proceedings of the 31st ACM Conference on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  year = {2026},
  month = July,
  pages = {273–279},
  DOI = {10.1145/3803400.3809312},
  url = {https://doi.org/10.1145/3803400.3809312}
}

@inproceedings{Pankiewicz2024,
  series = {ITiCSE'24},
  title = {Navigating Compiler Errors with AI Assistance - A Study of GPT Hints in an Introductory Programming Course},
  url = {http://dx.doi.org/10.1145/3649217.3653608},
  DOI = {10.1145/3649217.3653608},
  booktitle = {Proceedings of the 2024 on Innovation and Technology in Computer Science Education V. 1},
  publisher = {ACM},
  author = {Pankiewicz, Maciej and Baker, Ryan S.},
  year = {2024},
  month = July,
  pages = {94–100},
  collection = {ITiCSE 2024}
}

@article{Park2025,
  title = {Code suggestions and explanations in programming learning: Use of ChatGPT and performance},
  volume = {23},
  ISSN = {1472-8117},
  url = {http://dx.doi.org/10.1016/j.ijme.2024.101119},
  DOI = {10.1016/j.ijme.2024.101119},
  number = {2},
  journal = {The International Journal of Management Education},
  publisher = {Elsevier BV},
  author = {Park, Arum and Kim, Taekyung},
  year = {2025},
  month = July,
  pages = {101119}
}

@inproceedings{Prather2024,
  title = {The Widening Gap: The Benefits and Harms of Generative AI for Novice Programmers},
  author = {Prather, James and Reeves, Brent N. and Leinonen, Juho and MacNeil, Stephen and Randrianasolo, Arisoa S. and Becker, Brett A. and Kimmel, Bailey and Wright, Jared and Briggs, Ben},
  booktitle = {Proceedings of the 2024 ACM Conference on International Computing Education Research - Volume 1},
  publisher = {ACM},
  year = {2024},
  month = Aug,
  pages = {469–486},
  DOI = {10.1145/3632620.3671116},
  url = {https://doi.org/10.1145/3632620.3671116}
}

@inproceedings{Sheese2024,
  series = {ACE'24},
  title = {Patterns of Student Help-Seeking When Using a Large Language Model-Powered Programming Assistant},
  url = {http://dx.doi.org/10.1145/3636243.3636249},
  DOI = {10.1145/3636243.3636249},
  booktitle = {Proceedings of the 26th Australasian Computing Education Conference},
  publisher = {ACM},
  author = {Sheese, Brad and Liffiton, Mark and Savelka, Jaromir and Denny, Paul},
  year = {2024},
  month = Jan,
  pages = {49–57},
  collection = {ACE 2024}
}

@inproceedings{Shihab2025,
  title = {The Effects of GitHub Copilot on Computing Students' Programming Effectiveness, Efficiency, and Processes in Brownfield Coding Tasks},
  author = {Shihab, Md Istiak Hossain and Hundhausen, Christopher and Tariq, Ahsun and Haque, Summit and Qiao, Yunhan and Mulanda, Brian Wise},
  booktitle = {Proceedings of the 2025 ACM Conference on International Computing Education Research V.1},
  publisher = {ACM},
  year = {2025},
  month = Aug,
  pages = {407–420},
  DOI = {10.1145/3702652.3744219},
  url = {https://doi.org/10.1145/3702652.3744219}
}

@article{Sun2024,
  title = {Would ChatGPT-facilitated programming mode impact college students’ programming behaviors, performances, and perceptions? An empirical study},
  volume = {21},
  ISSN = {2365-9440},
  url = {http://dx.doi.org/10.1186/s41239-024-00446-5},
  DOI = {10.1186/s41239-024-00446-5},
  number = {1},
  journal = {International Journal of Educational Technology in Higher Education},
  publisher = {Springer Science and Business Media LLC},
  author = {Sun, Dan and Boudouaia, Azzeddine and Zhu, Chengcong and Li, Yan},
  year = {2024},
  month = Feb 
}

@article{Ye2025,
  title = {Improving students’ programming performance: an integrated mind mapping and generative AI chatbot learning approach},
  volume = {12},
  ISSN = {2662-9992},
  url = {http://dx.doi.org/10.1057/s41599-025-04846-4},
  DOI = {10.1057/s41599-025-04846-4},
  number = {1},
  journal = {Humanities and Social Sciences Communications},
  publisher = {Springer Science and Business Media LLC},
  author = {Ye, Xindong and Zhang, Wenyu and Zhou, Yuxin and Li, Xiaozhi and Zhou, Qiang},
  year = {2025},
  month = Apr 
}

@article{Li2025,
  title = {Generative artificial intelligence-supported programming education: Effects on learning performance, self-efficacy and processes},
  ISSN = {1449-3098},
  url = {http://dx.doi.org/10.14742/ajet.9932},
  DOI = {10.14742/ajet.9932},
  journal = {Australasian Journal of Educational Technology},
  publisher = {Australasian Society for Computers in Learning in Tertiary Education},
  author = {Li, Siran and Liu, Jiangyue and Dong, Qianyan},
  year = {2025},
  month = May 
}

@inproceedings{Ramachandra2026,
  title = {Detecting AI-Generated Code in Introductory Programming Courses},
  author = {Ramachandra, Aryan and Chaudhary, Suhani and Tran, Justin and Desai, Riti and Pang, Ashley and Salloum, Mariam},
  booktitle = {Proceedings of the 57th ACM Technical Symposium on Computer Science Education V.1},
  publisher = {ACM},
  year = {2026},
  month = Feb,
  pages = {894–900},
  DOI = {10.1145/3770762.3772522},
  url = {https://doi.org/10.1145/3770762.3772522}
}

@article{Wang2025,
  title = {ChatGPT-enhanced self-regulated learning in programming education: impacts on motivation, self-efficacy, and learning outcomes},
  volume = {34},
  ISSN = {1744-5191},
  url = {http://dx.doi.org/10.1080/10494820.2025.2559919},
  DOI = {10.1080/10494820.2025.2559919},
  number = {5},
  journal = {Interactive Learning Environments},
  publisher = {Informa UK Limited},
  author = {Wang, Zilin and Zou, Di and Zhang, Ruofei and Lee, Lap-Kei and Xie, Haoran and Wang, Fu Lee},
  year = {2025},
  month = Oct,
  pages = {3041–3066}
}

@inproceedings{Yang2024,
  title = {Debugging with an AI Tutor: Investigating Novice Help-seeking Behaviors and Perceived Learning},
  author = {Yang, Stephanie and Zhao, Hanzhang and Xu, Yudian and Brennan, Karen and Schneider, Bertrand},
  booktitle = {Proceedings of the 2024 ACM Conference on International Computing Education Research - Volume 1},
  publisher = {ACM},
  year = {2024},
  month = Aug,
  pages = {84–94},
  DOI = {10.1145/3632620.3671092},
  url = {https://doi.org/10.1145/3632620.3671092}
}

@article{Yang2025,
  title = {The effectiveness of ChatGPT in assisting high school students in programming learning: evidence from a quasi-experimental research},
  volume = {33},
  ISSN = {1744-5191},
  url = {http://dx.doi.org/10.1080/10494820.2025.2450659},
  DOI = {10.1080/10494820.2025.2450659},
  number = {6},
  journal = {Interactive Learning Environments},
  publisher = {Informa UK Limited},
  author = {Yang, Tzu-Chi and Hsu, Yi-Chuan and Wu, Jiun-Yu},
  year = {2025},
  month = Jan,
  pages = {3726–3743}
}

A Quarto Question (or Six)

I am converting the notes for “Managing Research Software Projects” from McCole to Quarto. Most of the changes have gone smoothly, but I’m stuck on a few things and would appreciate guidance. For reference, the materials are in this repository and you can view the rendered version here.

  1. The landing page shows the contents of index.qmd (which is good) but that page shows up as entry #1 in the table of contents (which is bad). I have tried using a # Title heading in index.qmd instead of a title field in the YAML frontmatter, and/or adding.unnumbered, .toc-ignore, and other classes to that H1 heading, but those don’t achieve what I want.
    The closest I can get to what I want is to give ./index.qmd an H1 title Overview and add {.unnumbered} to it. It’s clumsy, in that it still creates an entry in the table of contents, but it’ll do for now.

  2. Each page that has bibliographic citations lists references at the bottom of that page (see for example the Project Health page). I don’t want this: I want all citations to link to the appropriate entry in the bibliography page (e.g., this page in the example project).
    Add link-citations: true under format > html in _quarto.yml, then put :::{#refs}\n::: in bibliography/index.qmd.

  3. Each chapter in the tutorial is in a subdirectory of the root, e.g., ./intro/index.qmd is rendered as ./docs/intro/index.html. I want to have a slide deck alongside each chapter so that (for example) ./intro/slides.qmd would generate ./docs/intro/slides.html. (Each subdirectory is going to contain images, code fragments, and other artefacts that will be included in both the index.qmd prose and the slides.qmd slides. I find it easier to manage these if the two Markdown files are siblings.) I’ve tried setting this up a couple of different ways, but nothing has worked. What do I add to the frontmatter of slides.qmd to tell Quarto “these are slides”, where do I put a custom template for those slides, and what do I add to the _quarto.yml file to create a “Slides” section in the table of contents with links to these files? Or am I going about this in completely the wrong way?
    After a lot of frustration I have concluded that issue 1433 is still accurate: there’s no simple way to do what I want. I’m therefore generating slides by calling pandoc directly. This means the styling isn’t consistent with the main pages, but it’ll do for now.

  4. When Quarto renders the tutorial, it create a 1.1Mbyte directory called ./docs/site_libs with various supporting files (JavaScript, CSS, fonts, etc.). Can I configure Quarto to (a) stop it from creating this directory and (b) have HTML files refer to some absolute URL to find those files instead? I want to do this because I’m going to put the generated files here in the Third Bit site, and want to share one copy of the supporting files rather than have one per workshop. (I’m likely to have seven or eight workshops served from Third Bit once I’m done converting, and 8Mbyte of redundant files makes me squeamish.)
    There doesn’t appear to be a way to configure Quarto to put site_libs where I want it, so I’ve written a little Lua script to replace all references to it in the generated HTML with references to ../quarto/site_libs (with as many ..’s as needed to reach the root of the documents directory). It’s a hack, but it’ll work for now.

  5. I don’t like the way Quarto’s default CSS lays out description lists; for accessibility reasons I’d like notes to be rendered at the same size as main text, and there are probably several other small changes to layout that I’m going to want as well. What’s the best way to manage custom CSS given that I’m going to generate HTML separately for several different projects, but then serve them all from one site as siblings as described above? (I’m less worried about duplication here because the custom CSS will only be a few kilobytes, so this is much less urgent than the site_libs issue.)
    Put css: assets/mccole.css under format>html in _quarto.yml, then create assets/mccole.css and start overriding things there. I’m also modifying links to the assets directory to be ../quarto/assets when I deploy for the reasons discussed in the previous point.

  6. Finally, the glossary for the workshop is in ./glossary/index.qmd, and I use a little bit of custom Lua in ./bin/g.lua to handle the rendering. I’d like to store the glossary in Glosario format instead, and generate HTML from that. I think I know how to do this, but if anyone has already built what I’m after, I’d be grateful for a pointer.

If you have solutions to any of these problems, please give me a shout; thanks in advance for your help.

First Closure Workshop

Thanks to a lot of hard work by Liz Neeley, I had a chance to run the project closure workshop online yesterday. I think it went pretty well, and I really enjoyed meeting all the participants, but as the saying goes, no lesson survives first contact with learners. In particular, there’s a lot of duplication, and I think I need to reorganize the material in a 2x2 scheme:

SuddenGradual
Project ContinuesEmergency planningSuccess planning
Project EndsAbrupt closureDeliberate closure

I hope to put it back together by September; if you’d interested in having me run it for your team or your colleagues, please give me a shout.


Here are some of the questions people still had at the end of the workshop:

LLM Programming Exercises

What do you do when teaching programming with LLMs that isn’t in this list?

Critically review AI output.
Have the LLM answer a programming question or explain a concept, then ask learners to review its response collectively for correctness, clarity, and omissions, testing claims against examples or documentation.
Predict, solve, and compare.
Have learners predict what code an LLM will generate for a problem (or solve it independently), then compare their work with the AI-generated solution and explain the differences.
Debug and minimally repair code.
Give learners a deliberately flawed program, tell them it was generated by AI (even if it wasn’t), and ask them to identify, explain, and find the smallest possible fix for each bug without initially asking the AI for help.
Compare and rank multiple solutions.
Have the LLM generate several different solutions to the same programming problem, then have learners compare them for correctness, readability, and efficiency.
Guided discovery.
Have learners prompt the LLM to provide only progressively stronger hints or Socratic questions rather than complete solutions.
Code translation.
Give learners a short program in one language and prompt the LLM to translate it into another, then have learners annotate the translation to identify which programming concepts carried over and which changed.
Test the tests.
Prompt the LLM to generate test cases for a learner’s function, then have learners determine which are redundant and what edge cases the AI missed.
Prompt improvement.
Give learners a vague programming prompt and have them iteratively refine it for an LLM, comparing how changes affect the resulting code.
Understand unfamiliar code.
Give learners a large program without explanation and have them explore its structure and purpose using an LLM.
Fill in the blanks.
Give learners an incomplete program and have the LLM suggest several possible completions for learners to evaluate and test.
Error-message dialogue.
Have learners paste compiler or runtime error messages into an LLM, predict what advice it will give, and then assess whether that advice actually fixes the underlying problem.
Spot the hallucination.
Give learners explanations containing a mixture of correct and invented “facts” and have them use experiments and documentation to identify the false claims.
Refactor and improve.
Have learners refactor poorly structured or badly written code, then compare their changes with an LLM’s suggestions and defend their design choices.
Test-driven AI.
Have learners write the expected behavior and test cases for a function before prompting an LLM to implement it, then use the tests to evaluate and revise the generated code.
Role reversal.
Have learners write a program and prompt the LLM to act as a novice programmer who misunderstands it, then identify and correct the misconceptions in the AI’s interpretation.
AI-generated homework critique.
Have learners prompt an LLM to generate a beginner programming exercise, then critique whether the problem is well-designed.
Rubric construction.
Have learners prompt an LLM to propose a grading rubric for a programming assignment, then revise it as a class to make the criteria clearer and more meaningful.
Concept misconception.
Prompt an LLM to explain a programming concept as if it held a common beginner misconception, then have learners diagnose and correct the misconception.
Documentation detective.
Give learners documentation for a small program and have them inspect the actual code to find statements in the documentation that are unsupported or incorrect.
Prompt versus program.
Have learners solve a problem once by writing code and once by carefully prompting an LLM, then discuss which parts of computational thinking are shared between the two approaches.

A Survey of Programmers' Beliefs

Please help if you can: I am working with some students who are studying programmers’ beliefs about software engineering folklore. If you can spare a few minutes to answer the question in https://survey.bth.se/survey/2545, we would be very grateful. We would also be grateful if you could circulate the survey link to colleagues and friends, since we would like to reach as diverse a demographic as possible. Thanks in advance.

Rainy Day Thoughts on AI

A week ago I posted this here, on Mastodon, and on LinkedIn:

In his essay on Salvador Dali, Orwell argued that because Dali was a repulsive human being, the right wouldn’t admit that he was a great artist; conversely, because he was a great artist, the left wouldn’t admit he was a repulsive human being. I’m seeing the same thing with AI: because it’s unethical, one side won’t acknowledge that it’s useful, but because it’s useful, the other side won’t acknowledge that it’s unethical.

The responses have depressed me a bit, though to be fair, I’ve felt that way pretty much since I was laid off last October. Comments have gone like this:

AI isn’t really intelligence.
Yes, thank you, we know.
AI isn’t useful.
Thoughtful, intelligent people like Simon Willison, Jon Udell, Stefan Arentz, Sue Smith, and Sadie Lewis believe it lets them to do things in hours that would otherwise take days, or that they wouldn’t be able to do at all. I don’t think they’re easily fooled or lying to me.
How can you call something “useful” if it is (accelerating the climate crisis, causing cognitive decline, destroying jobs, etc.)?
Something can be useful and harmful; the question is whether the benefits outweigh the harms, and for whom. We decided “no” for DDT and CFCs but “yes” for long-haul flights, except that’s not exactly true: what actually happened was that by the time we realized how harmful jet emissions are to the climate, people were hooked.
“Arguing that AI is unethical is a fringe belief at this point, analogous to believing (in reverse chronological order) that social media, the internet, computers, mass media, industrialization, or electricity are unethical.”
Someone left that comment on my LinkedIn post. Setting aside the question of whether anyone ever actually claimed that using electricity was unethical, I don’t know how anyone can believe that actually existing AI isn’t. It is built on theft, dramatically accelerates the spread of disinformation and bias, further concentrates power in the hands of super-rich sociopaths, and, well, look at the list in the previous heading.
We’ll adapt just like we did to [name of previous industrial revolution].
Would you swap places with a Victorian factory worker circa 1850? Would you want your children to swap places with theirs? Didn’t think so. And if you really believe AI is going to usher in an era of prosperity so far-reaching that people won’t have to work unless they want to, put your money where your mouth is right now and implement UBI.
One person choosing not to use AI won’t make any difference.
Yes, and one raindrop won’t wear away a mountain. As Rieder argues in Catastrophe Ethics, you don’t have to do everything all the time, but that’s no excuse for choosing to do nothing.
It’s too big/too late to stop.
Bullshit. We got rid of lead in gasoline, asbestos in our walls, and a host of carcinogenic food additives I grew up with despite fierce opposition from people who were profiting from them. Society has reined in the powerful many times in the past; it has never been easy or perfect, but it can be done, and arguing otherwise only helps those who want to avoid accountability.

So what should I do here and now?

Refuse to use AI and tell others not to either.
I don’t believe people are going to stop using AI any more than I believe they’re suddenly going to stop smoking. Choosing this path therefore feels like choosing to be righteous but ineffective; I’ve been down that road before, and it has always proven sterile.
Wait for the bubble to burst and people to come to their senses.
I’ve been waiting for this for 18 months. I still believe it’s coming, but that doesn’t tell me what to do while I wait or when it does. It also doesn’t distinguish between the (repugnant) people and companies currently playing a trillion-dollar shell game and the technology that will be left behind when they implode.
Try to find ethical variants of the technology and encourage others to use them.
I always thought I’d get back into teaching when I retired, but I honestly don’t know what to say to a young programmer today about how to build software or how to get started in their career. Books like Miles’ The Sovereign Engineer offer answers, but aren’t evidence-based and ignore the ethical questions entirely. How to Not Be Wrong About AI is an attempt to address the former issue, but so far nobody’s been interested. (As one person said to me, everyone currently falls into one of three camps: “I know it works so I don’t need proof”, “I know it doesn’t work so I don’t need proof”, and “My CEO has mandated it so I don’t want proof”.)
Campaign to make AI companies legally accountable for the harm they do.
I believe that cognitive pollution is the best model to use for regulating social media and AI, and courts in the US may finally be starting to hold big tech companies liable for the damage their deliberately-addictive products do. I’d love to see more of this; I just don’t know what I can contribute, or how.

The truth is, the double whammy of being laid off just a few weeks after my daughter moved out for university has left me floundering at a time when both the tech industry and society as a whole seem to be doing the same. I could focus on the organizational change and project closure workshops, but working on them makes me feel like I’m avoiding the biggest thing to happen in tech in my lifetime. I could try sneaking into random labs in Toronto in the middle of the night and fixing their software for them, but the beneficiaries would probably just assume some rogue AI had done it.

Time for another cup of tea. If you came in peace, be welcome.

Orwell, Dali, and AI

In his essay on Salvador Dali, Orwell argued that because Dali was a repulsive human being, the right wouldn’t admit that he was a great artist; conversely, because he was a great artist, the left wouldn’t admit he was a repulsive human being. I’m seeing the same thing with AI: because it’s unethical, one side won’t acknowledge that it’s useful, but because it’s useful, the other side won’t acknowledge that it’s unethical.

Time to make another cup of tea…

Disasters for Small Teams

This post has been moved to a new home.