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

Summer Projects Revisited

So how did I do?

  1. Teach Organizational Change in Manchester in July: check.

  2. Teach shutting projects down for the first time: check.

  3. Teach How to Not Be Wrong About AI: no one was interested enough to host it, which surprised me.

  4. Revise and deliver Managing Research Software Projects: revised, but haven’t delivered.

  5. Finish writing Sex and Drugs and Guns and Code: check, for some value of “finished”.

  6. Write Lean for Python Programmers: I abandoned this one and Gleam for Python Programmers; no-one seemed interested in either.

  7. Finish writing The Cloudherd and the Tiger’s Boy: nope. I did finish The Makers Return and Eimin in Medef, though.

  8. Get an agent: nope. This is my biggest disappointment: without an agent, my chances of selling any of my fiction are essentially nil.

  9. Find a job of some kind: I’m still waiting to hear back on a part-time gig with the Canadian government, but nothing else has materialized.

Outline for an SDGC Workshop

This one-day workshop introduces a few ideas that someone with a background in computer science (or tech more generally) needs to know in order to think clearly about the harms of social media and AI, and about how they should be regulated. I would be very grateful for feedback; in particular, I know I’m trying to cram far too much into one day, and many of my references are probably out of date.

At a glance

Please see these pages for background.

Stance

  1. Power in society is distributed very unequally, and much of what looks “neutral” or “technical” is actually a rule that favors some people over others.
  2. Inequality is substantially the product of policy choices and inherited advantage, not the natural sorting of individual talent.
  3. Markets are human institutions, not laws of nature. There is no such thing as a market without rules; the only question is whose interests the rules serve.
  4. What counts as “harm”, and therefore what gets regulated, is also the result of decisions made by people. Alcohol, cannabis, sex, and guns are not regulated in proportion to the damage they do; they are regulated according to whose interests and whose anxieties dominate.
  5. Regulation of food, medicine, air, water, cars, and tobacco has repeatedly protected the public. Failures of regulation usually come from regulatory capture and weak enforcement, not from the impossibility of governing markets.
  6. Change is possible. It is usually won by organized collective action rather than by persuasion alone, and technologists have unusual leverage in the fights now under way.

Learning outcomes

By the end of the day, participants should be able to:

How to run this

Pick one exercise per lesson.
Four or more are provided so you can match the room, the time available, and the participants’ interests. Do not try to run them all.
Exercises are the assessment.
Exercises are where participants convert a claim into something they can use. Do not skip the debriefs: they are where the learning is consolidated.
Use think-pair-share as the default format.
One minute alone, two minutes in pairs, then report back. This gets more voices into the room than any other structure in the time available.
Keep it concrete.
Every abstract concept in this plan has a named example. When discussion drifts into abstraction, ask, “What does that look like in a product or a law?”
Do not manufacture consensus.
Like-minded people and disagree about ends and means. “What would change your mind?” is usually a better question than “who’s right?”
Separate the descriptive from the normative.
“This is how X works” and “this is what we should do about X” are different claims with different burdens of proof. Keep them distinct.

Materials

1) Power and institutions

Why do some people’s preferences become policy and other people’s don’t?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “Think of a product decision at your company. Who actually decided it, and whose interests won?”
  2. What is power? (10 min): Walk through Lukes’ three faces with concrete examples. Visible: who wins the vote. Hidden: who writes the agenda, the roadmap, the API. Invisible: who shapes what feels “natural”, “obvious”, or “inevitable”. Point out that a “neutral” default or a “technical” constraint is usually an act of agenda-setting.
  3. Institutions (10 min): North’s definition. Formal vs. informal rules. Show that software itself is an institution: default settings, permission models, and rate limits are rules that allocate advantage. A design decision is a governance decision.
  4. Collective action (7 min): Olson’s concentrated-vs-diffuse logic. Example: ad-tech firms (few, organized, rich) versus individual users (many, unorganized, each with a small stake). This single asymmetry predicts much of tech policy.
  5. Recap (5 min).

Exercises

Map the decision.
Pick a real decision, such as an API change, a layoff, a content-moderation rule. On a whiteboard, list (a) the visible decision-makers, (b) who set the agenda that made this the decision, and (c) whose preferences shaped what seemed “natural”. Which face of power is hardest to see, and why?
Three-faces audit.
Take a news story about a tech-policy fight. Find one example of each face of power, or explain which face is absent from the public account and why that absence matters.
Concentrated vs. diffuse.
List the stakeholders in a policy question (e.g., banning facial recognition in public spaces). Classify each as concentrated or diffuse, predict which will organize most effectively, and check your prediction against what actually happened.
Design the institution.
A team is choosing default privacy settings for a product. Write three different “rules of the game” (a default, a policy, a norm) that produce three different outcomes, and say who wins under each.
Path dependence hunt.
Find a feature, protocol, or company practice whose current form is explained more by history (“it’s always been done this way”) than by present need. Trace the lock-in and name who benefits from keeping it.

Takeaway

Power is not only about who wins visible fights; it is about who sets the agenda and who shapes what people think they want. Institutions are the mechanism, and they are never neutral.

2) Markets are made, not natural

What are markets, and when do they fail?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “Which product in this room is unregulated?” Let the room discover that the answer is “none.”
  2. Markets are constructed (10 min): Every marketplace has rules about who may sell, what counts as fraud, who is liable, and how disputes are resolved. Those rules are choices with distributional consequences. Show that “deregulation” is re-regulation.
  3. Market failure (12 min): Four mechanisms, each with a tech example:
    1. Externalities (misinformation, polarization, teen anxiety as costs priced at zero)
    2. Public goods (an informed public, institutional trust)
    3. information asymmetry (you do not know what the recommender is doing, or why)
    4. market power (network effects make dominant social networks hard to exit)
  4. Who pays, who benefits (5 min): “Efficiency” is not the same as fairness. A market can be efficient and still concentrate benefits and diffuse harms. (Lesson 5 uses this distinction.)

Exercises

Externality inventory.
Pick one social-media harm (polarization, teen anxiety, election misinformation). Identify the negative externality, who bears the cost, who captures the benefit, and why the price does not reflect the cost.
Public-good puzzle.
Classify “an informed electorate,” “trust in institutions,” and “online safety” as public goods. Explain the free-rider problem and why no single company has an incentive to produce them. What follows for who should produce them?
Information asymmetry.
Choose a feature such as a recommender, a “black box” credit or hiring model, or an ad auction. Who knows more, the operator or the user? What could close the gap: disclosure, audit, a right to explanation, or something else?
Natural monopoly.
Argue whether a dominant social network is a natural monopoly due to network effects, high switching costs, and/or data advantages). If it is, what follows for regulation?
Free market autopsy.
Find a product described as “the free market at work.” List every government rule (and private rule) it depends on related to property, contract, fraud, liability, and standards. Discuss: is “deregulation” ever actually the absence of rules?

Takeaway

There is no market without rules. The interesting questions are which rules exist, who wrote them, and who benefits. When markets fail, regulation is the standard correction, not an alien intrusion.

3) How people actually think

How do real humans make decisions, and how can that be exploited?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “Why did you click the last thing you clicked?”
  2. Two systems and biases (10 min): System 1/System 2, then four biases with everyday online examples. Emphasize: these are features, usually adaptive, but they are predictable, and predictability is exploitability.
  3. Identity and belonging (10 min): Minimal-group results; identity-protective cognition; Asch and Milgram as demonstrations that social context can overpower private judgment (including critique of Milgram’s findings). Moral foundations: why two reasonable people talk past each other about content moderation.
  4. The attention economy (7 min): Map the psychological mechanisms to specific design choices: variable rewards, manufactured urgency, disguised ads, social proof, default nudges. A design choice is a psychological intervention, whether the designer acknowledges it or not.

Exercises

Bias autopsy.
Take a recent online argument or viral post. Identify at least two specific biases at work (confirmation, availability, in-group signaling, anchoring) and say how the platform’s design amplified them.
Dark-pattern hunt.
In a product you use, find one dark pattern (forced continuity, disguised ads, manufactured urgency, infinite scroll, confirshaming). Name the psychological mechanism it exploits.
Identity check.
Think of a belief you hold partly because of group membership. Describe, honestly, what would happen to your social life if you changed it. Discuss what this implies for “if we just showed people the facts.”
Moral-foundations translation.
Pick a policy debate (e.g., whether to moderate misinformation). Argue it once from a care/fairness frame and once from a loyalty/authority/purity frame. Which audiences respond to which?
Design a nudge.
Choose a desirable online behavior (e.g., reading before sharing). Design one System 1 intervention (default, friction, social proof) and one System 2 intervention (education, disclosure). Predict which works better and why, then discuss the ethics of each.

Takeaway

People are not broken computers: they are social animals with fast, fallible, identity-driven cognition. Design that respects this is possible; design that exploits it is the business model of the attention economy.

4)Inequality and stratification

Why are some people consistently better off, and is that “natural”?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “When you explain why someone succeeded or failed, which verbs do you reach for?”
  2. Three dimensions (10 min): Weber’s class/status/power, with tech examples: a staff engineer may have high class but limited power; a founder has power; a moderator has neither. Mismatches matter.
  3. Structure vs. individual (12 min): The fundamental attribution error applied to society: we explain others’ outcomes by their traits and our own by circumstance. Cumulative advantage: early advantage compounds. Opportunity hoarding: how “merit” filters are built to reproduce advantage. Intersectionality: compounding and interacting disadvantage, and why systems (e.g., a facial-recognition model, a hiring algorithm) distribute harm unevenly across overlapping identities.
  4. Mobility and measurement (5 min): Mobility is low and sticky across generations. Treat “meritocracy” as an empirical claim to test, not an assumption.

Exercises

Explain the gap.
Take a real inequality (who gets into a selective program, who receives venture funding). Produce two explanations (one individual, one structural) then discuss which better fits the evidence and why the individual one is the cultural default.
Three-dimension map.
For four tech roles (e.g., startup founder, staff engineer, content moderator, gig worker), rate class/status/power as high or low. Discuss the mismatches (e.g., high status but low power; high income but low security).
Cumulative advantage.
Trace how one early advantage like a wealthy school, a first internship, seed funding, or an early follower count compounds across a career. Identify the points where policy or design could interrupt the compounding.
Opportunity-hoarding audit.
Find a credential, interview process, or referral network that functions to hoard opportunity. Distinguish its stated purpose from its actual effect.
Intersectional case.
Analyze how a policy or product harms people differently across overlapping identities (a facial-recognition system, a hiring algorithm, an automated welfare screen). Why does a single-axis analysis miss the worst harms?

Takeaway

Inequality is not a sorting of individuals by merit; it is the accumulated effect of rules, networks, and compounding advantage. Meritocracy is a claim to test, and often a story that legitimizes inheritance.

5) Deciding what is harmful and how to regulate it

How does a society decide what counts as harm, and what should it do about the harms it recognizes?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “Which is more dangerous: alcohol or cannabis? How do you know, and does the law match your answer?”
  2. Sex, drugs, and guns (10 min): three cases that show harm is contested, not measured.
  3. Sex. What was “private” versus what was “criminal” has been redrawn case by case, in someone’s interests, with no consistent underlying principle. Sexual behavior between consenting adults was legally public (in the sense of being criminally regulated) well into the twentieth century; the expansion of privacy was won, not discovered.
  4. Drugs. Alcohol kills hundreds of thousands a year and is sold in supermarkets; cannabis, with a lower measured harm profile, was a criminal offense whose enforcement fell almost entirely on Black and Latino communities. Portugal’s 2001 decriminalization of personal possession, paired with treatment and harm reduction, cut HIV transmission and overdose deaths without raising use.
  5. Guns. After Columbine, legislators went after violent video games; the evidence never supported the hypothesis, and cross-national comparisons point to gun availability, inequality, and the history of racially organized violence as the real drivers. Motivated reasoning (Lesson 3) means even a trained scientist who owns a gun scrutinizes gun-violence studies more skeptically than climate studies.
  6. The point is that we do not first measure harm and then regulate. We first decide who and what matters, then find or manufacture the harm that justifies the decision.
  7. Two models of harm (7 min): rare/dramatic/attributable versus diffuse/cumulative. The engineer’s default is the first; the worst damage from industry has been the second. Leaded gasoline lowered a generation’s IQs without any single tank of fuel causing a measurable injury; no particular cigarette caused any particular cancer death. Social media’s harms are this kind (so-called “cognitive pollution”), so the causal chain is long, probabilistic, and hard to attribute, and therefore hard to regulate.
  8. Pollution and dangerous pharmaceuticals (7 min): the two cases where regulation actually worked, and why.
  9. Pollution. Hill and Doll’s 1950 study linked smoking to lung cancer; the tobacco industry’s response was to fund research designed to produce uncertainty, and it worked for decades (the same playbook ran for leaded gasoline, asbestos, and oxycontin, and is running now for social media and AI). The remedy was the pollution model: hold the emitter liable for the aggregate, not for a specific injury. The ozone layer was protected before it cost lives: proof we need not wait for disaster.
  10. Dangerous pharmaceuticals. Thalidomide was approved in West Germany in 1957; Frances Kelsey, a pharmacologist at the FDA, refused to approve it in the US because the safety evidence was insufficient, and the birth defects that followed where it was approved vindicated her. The result was pre-market approval and the precautionary principle.
  11. What worked. Accurate diagnosis of the actual harm; the right instrument; and a regulator that was not captured. Capture is the recurring enemy, and the industries that fight regulation are the same ones that manufacture uncertainty about it.
  12. Recap and bridge (3 min): Social-media and AI harms are pollution-model harms. The trap is moral-panic framing (e.g., “ban the kids’ phones”) instead of the actual harm: attention extraction, addictive design, discrimination, surveillance. Lessons 6 and 7 apply this to media and to change.

Exercises

Rank the harms, then the laws.
Consider the list “alcohol, cannabis, heroin, gambling, social media, AI-generated misinformation”. Rank the items by measured harm, then by how the law actually treats them. Discuss the gaps and what explains them.
Two models of harm.
Pick a harm (e.g., a bridge collapse, leaded gasoline, a data breach, or teen anxiety from Instagram). Classify it as rare-dramatic-attributable or diffuse-cumulative, and say which regulatory instrument each model naturally suggests. Which model were you trained to think in?
Moral panic vs. real harm.
Choose a concern (violent video games, kids and phones, “AI will end humanity”). List the features that make it look like a moral panic and the features that make it an evidence-backed harm. What is the actual harm the panic may be distracting from?
Precautionary vs. wait-and-see.
Replay the thalidomide decision: you are the regulator with evidence that is suggestive but not conclusive. Do you approve or wait? What does your answer imply for “move fast and break things” and for releasing open-weight AI models?
Redesign the law.
Pick a harm currently regulated on a moral or panic basis rather than an evidence basis (e.g., cannabis, a social-media feature). Propose a regulation that tracks the actual harm, and name the political obstacles to passing it.

Takeaway

Harm is not a fact that precedes regulation; it is a claim made by the powerful, the panicked, and the organized. Regulating well means diagnosing the actual harm rather than the one that generates the best testimony, using the pollution and product-safety models where they fit, and defending the regulator from capture.

6) Media, ideology, and public opinion

How do people come to believe what they believe about the world?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “What did you learn about the world this week, and who decided it was worth your attention?”
  2. From gatekeeping to platforms (10 min): The twentieth-century gatekeeper and its problems; the platform replacement and its problems. Concentration did not go away; it changed shape and added a profit motive tuned to engagement.
  3. Framing and agenda (10 min): Agenda-setting and framing with concrete before/after pairs. Show that a reframe changes the feasible policy menu.
  4. The propaganda model (10 min): Herman and Chomsky’s five filters, updated for platforms (engagement, algorithmic amplification, influencer economies). Manufactured consent: the center of gravity of “respectable” debate is not where public opinion actually is.
  5. Epistemic fragmentation (5 min): Polarization and filter bubbles, with the empirical caveat. Acknowledge uncertainty rather than overclaiming; this is what a rigorous progressive account does.

Exercises

Framing audit.
Find one story covered two ways (e.g., “misinformation” versus “platform accountability”). List the frames and metaphors, and note who is cast as the agent and who as the victim.
Agenda check.
Compare what a news outlet and a social-media feed surfaced about the same event. What was on the agenda, and what was conspicuously absent? Who benefits from that absence?
Propaganda filters today.
Take a tech-policy controversy. Walk through Herman and Chomsky’s five filters as updated for platforms, and identify which are most active in this case.
Manufacturing a panic.
Take a moral panic (e.g., kids and screens, “AI will end humanity”). Trace how news coverage and platform feeds frame it: which experts get quoted, what metaphors recur, who is cast as the villain. How does the framing amplify the alarm while suppressing the evidence?
Redesign the gatekeeper.
If you had to replace engagement maximization with a different editorial principle, what would it be? Name the new distortions it would introduce.

Takeaway

Belief is produced, not just discovered. Whoever controls the agenda and the frame controls a large part of what is thinkable. Platforms changed the economics of that production, and with it, the politics.

7) How change happens

Given all of this, what actually produces change, and what should we do about social media and AI?

Learning objectives

Key concepts

Flow

  1. Opening question (3 min): “Name one thing that is better now than it was fifty years ago. Who made it better, and how?”
  2. How change happens (12 min): Organization + opportunity + framing. Examples: civil rights, environmental regulation, seat belts, tobacco, marriage equality, worker safety. Emphasize: change is slow, non-linear, and won by pressure, not persuasion alone. Kingdon’s three streams and the policy window:
    • Problem: is it defined as a crisis?
    • Politics: who is the constituency?
    • Policy: is there a ready solution?
  3. The technologist’s role (7 min): Insider/outsider power. Engineers can refuse, whistleblow, organize, build alternatives, or work on policy. Their leverage is unusual (scarcity, access) and their constraints are real (contracts, career risk, the ideology of neutrality).
  4. Applying the toolkit (5 min): Name the harms (attention extraction, misinformation, polarization, discrimination, labor deskilling, surveillance, concentration, environmental cost). Map each to the day’s lessons. 1 Outline a realistic menu (5 min): transparency and audits, liability, structural remedies (interoperability, breakups), worker power, public alternatives, global coordination. Be honest about capture risk for each.
  5. Synthesis and close (5 min): The arc of the day: “how society works” is knowable, and knowing it is the prerequisite for changing it.

Exercises

Policy-window map.
Pick one concrete harm. For Kingdon’s three streams: assess whether a window is open and what would open it.
Coalition design.
Choose a reform (e.g., mandatory algorithmic audits). List likely supporters, likely opponents, and the unexpected allies (parents, small business, civil-liberty groups, religious communities) that could make it a winning coalition.
Leverage inventory.
As a technologist, list your specific sources of leverage (skills, access, capital, community) and one concrete action you could take in each of the next 1, 6, and 12 months.
Harm-to-lesson mapping.
Take one harm (e.g., AI-driven hiring discrimination) and write one sentence connecting it to each lesson. The point is to demonstrate that every real harm has structural, economic, psychological, stratificational, regulatory, and ideological dimensions.
Reform-menu debate.
Assign groups different positions (e.g., audits only, liability, breakups, public options, worker power, “it cannot be fixed”). Each group argues its case; then the room discusses which combination is realistic and coherent.
Backward plan.
Pick a target outcome five years out (e.g., “audits of high-impact models are mandatory and meaningful”). Work backward to name the milestones, coalitions, and political conditions required at each stage.

Takeaway

The harms are not mysterious and the responses are not untried. Every tool discussed in the workshop is available to people who organize. Technologists hold real cards; the question is whether they play them.

Closing synthesis (25 min)

If there is time left, use it to make the day’s through-line explicit, not to introduce new material.

  1. Power and institutions set the rules; markets are made, not natural; people are social and fallible; inequality is produced, not earned; harm is contested, not measured; regulation can and does work when it is not captured; media manufacture the thinkable; change comes from organized pressure.
  2. Ask each participant to write one sentence naming a specific social-media or AI harm, the lesson that best explains it, and one realistic response. Go around the room; collect the sentences.
  3. Point to the reading list below and, if running this with colleagues, to a follow-up session or reading group.

Reading list

  1. Power and institutions
  2. Markets are made, not natural
  3. How people actually think
  4. Inequality and stratification
  5. Deciding what is harmful and how we regulate it
  6. Media, ideology, and public opinion
  7. How change happens, and applying it all

On social media and AI specifically:

Appendix: harm-to-lesson map

A cheat sheet for the synthesis in Lesson 7.

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.