Lazyweb, a question: let's say that you could teach a "cultural anthropology" type of course about computing to first year students, to prepare them for the codebases, communities, patterns and software philosophies of the programming world. You've got about ten weeks to run it. What would you teach in that course and why?

(RTs appreciated for reach.)

@mhoye I'd listen to anthropologist Worf!
@mhoye
If it were me teaching it, the argument in this thread would be my anchoring line of thought: https://hachyderm.io/@inthehands/111973002136820218
Paul Cantrell (@[email protected])

Re this important thread from @[email protected]: https://mastodon.social/@grimalkina/111972810596703896 I just gave a little soapbox to my Software Design and Development students that I give every time I teach the class, and I’ll give it here on Mastodon. Software development is an intensely social discipline. 1/

Hachyderm.io
@inthehands @mhoye I was going to reply with "learn how to communicate and learn to ask 'why?'" but you've put it far more eloquently in this thread.
@badlydrawn @mhoye
Well, that’s a message that bears repeating in many many forms. “Broken record therapy,” as my retired psychologist dad says.
@inthehands @mhoye funny coincidence ... I was trying to explain the idea of a stuck record to some younger team members only yesterday.
@mhoye first of all, a "how to work in teams" course or ten is apparently badly needed given my experience hiring recent CS grads, so this is a great question. I lack the breadth of experience to design such a course that would cover a wide enough range of possibility. But I would start with
non-programming associated disciplines, toxic vs healthy team dynamics, work/life balance, communication styles, code review cultures (taking/giving peer critique) plus "here's what the buzzwords mean"
@mhoye I think detailed examples of several wildly different work groups would be informative. This small team is all senior level and above, they have very lightly written specs, no PM, write all their own tests, bitch a lot but are really fine, etc. This large team has UX including both functional and UI specs, dedicated QA, intricate PM process etc. This gang of adorable cutting edge loons is building a game from their various polycules spread across several time zones.

@mhoye I think about this a lot so I'll stop there, I could go on about "things I wish greenies came in knowing that aren't about computer science" for quite awhile

I mean the main thing though is software is just ideas and is made by people and so if you got into computers to avoid people you're actually about to get a rude shock, but if you like people you'll actually do great in a healthy workplace

@mhoye I would be inoculating them against the UNIX cult for two weeks, teaching the capitalist tragedy of the web for a week, and sending them to therapy for seven weeks
@mhoye I know I'd include chapter 5 from "A Voyage to Laputa, etc." in Gulliver's Travels.
@mhoye software netiquette and why it exists (how to ask for help, how to write a good bug report, brief explanation of the reasoning behind mailing list etiquette, how to interpret feedback on a code review or technical proposal). Actually the "how to receive code review" one is big in general

@mhoye Great question!

I'd probably start with complexity (Fred Brooks "No Silver Bullet" and maybe "Out of the Tar Pit"). You could potentially frame all software culture as a philosophical approach to complexity: managing/reducing it.

Probably then I'd want to look at hacker culture (Cliff Stoll? Morris worm, Mitnick, captain Crunch) and then talk about open source (The Cathedral and the Bazaar).

It's maybe odd that open-source software practices became common in industry.

@mhoye

- a look at the typical artefacts found in software repos and the infrastructure around them. So from README/LICENSE/CONTRIB through badges in README, to dependabot, etc. As a way to publish to norms and navigate a project

- implicit and explicit norms around bug reporting and pull requests

- project archetypes and maintenance styles, see e.g. Nadia Eghbal book.

- primer on different licences and their intent

@mhoye

- how to work in public and how it can go wrong

- forking, as a process for contribution but also as a means of exercising rights

- discussion of different forms of contribution

...are the things that spring to mind.

@mhoye I'd like to start with some kind of structured "hackathon" experience that would colocate beginners with more experienced people and let people see what it is like to go from zero to product, give some formal instruction, have another hackthon at the end.
@mhoye I actually had an "Introduction to Working in Open Source with the Apache Software Foundation" deck at one of my former employers. It would be too focused for this use, but it could offer some insight into one of the major players in open source development.
@mhoye Damn. This nerd-sniped me. Thanks @b0rk. Here's my knee-jerk syllabus in 15 minutes...

@mhoye a cultural anthropology of computing is a very broad topic. I see some of the replies are on common modern software development practices, which is useful but seems pretty narrow.

I think going into the actual cultural sub-groups that have come and gone over the past ~80 years would make more sense to me. How programming was considered women's work in the US in the early days, then co-opted by men as prestige in the work went up, how the Cold War affected software licensing and sharing, the GNU reaction to that (and you gotta include a picture of "Saint IGNUcius" just for fun here), the development of other OSS groups like Apache and the creative commons once the internet became common. There should be some talk about the broader impact of these things on the rest of the world just as the rest of the world helped shape these things.

Finally the end of it could be going into various common subgroups in existence today and what practices they follow, not judging which are best.

@mhoye Something about agile -- what it is, why it arose, the fact that everyone uses this term but no one uses it the same way. Agile manifesto, some of the 18F/USDS stuff (the healthcare.gov diving save is a great case study but also seeing how government navigates this illuminates real-world constraints). Why, because it's ubiquitous, even if more in the breach than the observance - and it lets you pull on threads of why projects succeed/fail.
@mhoye Something about allied professions. This is what a UX person does and how it contributes to successful product development. Similarly project manager, product manager, technical writer, etc. Maybe have guest speakers, who are often fun in classes. So they know it's a team sport; that dev isn't the only skill required; and maybe they won't be assholes to these people.
@mhoye Some kind of excuse to read at least excerpts from *Unlocking the Clubhouse*, look at graphs of women CS majors pre/post mid-80s, and those studies about how (e.g.) women's PRs are relatively unsuccessful if their name/avi are feminine and relatively successful if not. Because it isn't all meritocracy, that book might be PAINFULLY RELATABLE even now to female students, and also maybe we should stop being like that; there's a hell of a good universe next door. (Generalize to other groups.)
@mhoye Maybe something about evaluating a dependency for suitability in a project. This means pulling on licensing but also *the community around the project* : number of stars/forks, do issues get closed (& what's the conversation like), are PRs getting merged, etc. Because software is actually an ecosystem and a lot of learning/dev is social.
@mhoye Actually before I did this syllabus I would reread *Kill it with Fire* and I would do anything in my power to get an hour of Marianne Bellotti's time for advice on this question. (She is literally an anthropologist who ended up in computing. Possibly likewise with Jennifer Pahlka's book; lots of interesting stories of software playing out in the real world (...beyond SV because omg the whole world is not SV).
@mhoye oh and I might find an excuse to read the therac-25 paper even though it may not strictly be within this course's learning objectives because people should just have read that
@mhoye the things i've had to teach computer science graduates in the past range from "i wish these kids had gotten a methods course re: version control, code review, shell basics" to "i wish somebody had taught these kids to program in any way" to "look, here are some sociopolitical dynamics that you're going to hate for the rest of your career"
@mhoye GNU, Cathedral and the Bazaar, version control (CVS, SVN, Git), software licensing ("copyleft"), "embrace, extend, extinguish", StackOverflow, continuous integration ("DevOps"), shareware, SaaS, "sneakernet" (and the arms race of piracy/DRM)
@Jaimie CatB is a hard no. That text has aged extraordinarily badly, as has its author.

@mhoye a final essay exam question could be "here's a one-paragraph summary of CatB, explain why it resonated in the late-90s and what it got wrong".

(You can also borrow from my fav compsci prof, who on occasion assigns "explain this XKCD" as a final exam question...)

@mhoye You need to design for the workflow of your users and around the pain points of your users. This means before you write a single line of code you need to map what the users are doing first.

So the course has to drill that into students plus teaching participant observation and semi-structured interviewing.

@mhoye Dunning-Kruger, Imposter Syndrome, resulting false self images and their consequences (such as gaslighting and confirmation bias); how to identify this in oneself and one's colleagues, how to protect against it from others, and how to transcend it yourself, and get comfortable with not knowing and with others not knowing.

@mhoye

- Engineering Disease is real
- Spending too much time on Hacker News can rot your brain and reduce your capacity for Human Empathy
- Ditto Reddit
- When building something that Bad agents could easily use to cause harm to others, never assume that 'Nobody would ever do X'. Ensure that doing X is more trouble than it's worth for the Bad Agents.
- When testing software / products make sure to have more women as test subjects, actually more minorities in general

@mhoye Maybe run it as a sim? Pick a popular but understaffed open source project, give them a goal of integrating it but also fixing one or more outstanding bugs or popular feature requests and ensuring that the PRs get back into the project. Also give them a continued courseload at the same time, and, ideally, coordinate the assignment with a parallel team at an institution in an opposite time zone (> 5 hours difference)

@mhoye

I've had the outline of a lightning talk in my head for a while. It goes like this:

Here are the significant tech advances of the last N years:

[jumble of logos]

And here are the successful tech startups of the last N years:

[more logos]

And here's the overlap:

[ Venn diagram showing almost none]

In your tech life, you contribute to something significant and you may get rich, but you won't do both.

Plan accordingly.

@mhoye Lots of great answers already in the thread. I think that, in 2024, there needs to be at least one session on "ML/AI In Practice"...

* how is training a model different than writing an algorithm
* how to think about data, about training, about inference
* how to improve the quality of a classifier, a predictor, a transformer
* what people with ML/AI backgrounds expect to get from software engineers, and what you should expect from them
* how to talk about safety, bias, and error

A 1970s Essay Predicted Silicon Valley's High-Minded Tyranny

Published in Ms. magazine, "The Tyranny of Structurelessness" observes that organizations built to avoid hierarchy develop leaders with pernicious power.

WIRED
@mhoye “Dreaming in Code” http://www.dreamingincode.com/
Dreaming in Code

Dreaming in Code - Scott Rosenberg’s software epic

@mhoye “Worse is Better” and all the back and forth follow-ups https://www.dreamsongs.com/WorseIsBetter.html
Worse Is Better

@mhoye “Zero to One,” not as a model to follow but because it explains how a lot of the tech industry thinks.

@mhoye I want to take it, not teach it. 

I suppose a bit on the evolution of source management would be neat.

Go over various philosophies towards testing and documentation. Bias this towards DOING THEM.

How to look through a codebase and extract information about the culture by identifying things about the code over time, making like... Code Strata. But first I'd have to lean to do that myself.

@mhoye I think that last one may not be an intro
class...

@mhoye

Amazing thread! And makes me think 10 weeks is not at all enough :-)

@mhoye I don't feel qualified to come up with a whole course outline, but here are some things I'd for sure want to put in:

-success and failures in abstraction, generalization, and specialization, to help make the students more thoughtful of not just how but whether to apply more of one of those to a project
-showing how the interpretation of common phrases/concepts, like "object oriented", have had varied and evolving interpretations, and how different languages, patterns, and guidelines have approached the supposedly-same idea in different ways
-compare different language and library abstractions that fulfill the same objective, such as comparing exceptions and sentinel values to sum types

@mhoye You absolutely need to teach filesystems now (meaning: how files are organized in directories ("folders")) because most kids these days(tm) do not get in contact with regular files any more. And this lack of understanding will make it much harder to teach some of the other concepts.

Also, you need to know about ASCII (and please build UTF-8 on top of that).

Stuff from XEROX Parc doesn't hurt (early computer interaction), early computer graphics (conway's game of life) is always nice.

@mhoye going through the other answers, I realize that I might have misunderstood your question. Anyway: please take what suits your course and feel free to leave out anything else :-)

@mhoye depends a bit on the program you're doing this for. Is this more software engineers or more mathematical computer scientists?

Anyways, probably run them through the gamut of things that software actually is used for (electrical engineers in safety-critical disciplines are sometimes a bit confused about the break things and maybe move fast philosophy of modern web-centered SE; people in modern software companies by the lack of good tooling in embedded. Aerospace by the lack of req. eng.;

@mhoye and this all leads to different company philosophies).

Then look at one or two projects that involve software development and look at what the challenges are that needed to be tackled, and how cooperation within and between teems, with vendors, libraries, users, and API consumers happens.

Look at incentive structures for different people in different constructs (FOSS enthusiast after work; PhD cand; software employee in car industry; employee at large software company; manager there),

@mhoye and the social struggles they have. Is it time pressure? Money? Disconnect from management? Appreciation? Disconnect from the purpose of the software?

I'd probably also take a lecture to talk about quantifiable effects of lack of gender equality, and diversity (if you can find an expert at a different faculty, invite them?).

Talk about how FOSS projects survive differently than companies. Talk them through a contribution to someone else's (or another team's) codebase in both cases.

EOF

@mhoye I just realized that "first semester" means that students still think they'll be developing the next big AAAA game alone; you might want to very brutally clean up that misconception.
@mhoye A thing I would want to work in is teaching how to find and remove Chesterton's fence.
@mhoye And the very related: finding out what is actually running in production.
@mhoye this guy if he agrees: https://leanpub.com/u/laurentbossavit Check his book, If you didn't read it. Great stuff.
Laurent Bossavit