We all know much of the learning in engineering is on the job anyways, so the role of formal education is less about particular job skills and more about building foundations for understanding - exactly the time and place to teach ethical frameworks and other critical interfaces with society.
Ten years later you may not remember the details, but at least you'll remember there's some kind of ethical framework or lesson that explains why a course of action your boss is considering might not be right or has implications they're not considering. The world needs more of this kind of awareness from CS grads. Not suggesting this be a major part of the curriculum, but just maybe we could go from 0 required courses covering this to 1 or 2.
[1] https://web.stanford.edu/class/cs182/ and https://5harad.com/mse330/ Yes, STS (https://sts.stanford.edu) exists, but again that's elective and thus involves sacrificing opportunities to take those courses.
EDIT- see epoch_100's link here about Stanford CS embedding ethics throughout the curriculum, which seems to address this concern: https://hai.stanford.edu/news/building-ethical-computational...
The hypotheticals and situations presented and discussed in many of them are very similar to yearly mandatory classes we have to take at FAANG (and many other workplaces I assume) and it boils down to having a checkbox that says "I'm not stupid".
Real world ethics is much more subtle and difficult to teach imo. Like how do you do trade-offs around cost/societal issues/potential financial consequences and do it under pressure with your job on the line.
In Canada, we have the iron ring given to engineers to remind them of their duties to society, I think that serves as a good reminder even if it's symbolic.
- Ethics should be a required course for CS.
- CS classes in general do a poor job of tracking well with the industry. Fine for some things (eg, theory), but awful for others (eg, any Software Engineering course which touches on waterfall.)
For those who have missed out, here's an ethics course in the size of a paragraph:
Most engineering ethics focus on life and death, such as making sure your bridge doesn't collapse; Most software is not a matter of life and death, so ethics may seem irrelevant. However, the incredible power of technology means your design choices will have an impact on the lives of many. Seeing red lines where you need to tell your employer no is important, but everyday ethical thinking will find problems other approaches to design will be blind to. This in turn will make better products, and increase your value to your employer. So throw an "ethics" section in your design doc, and ask the question "Does this technology as designed hurt any groups of people with specific characteristics?" You might find that your camera app needs better calibration for dark skin tones, that your UI elements are too hard to use for women with large fingernails or people with minor motor disabilities, or perhaps that one of the JS libraries your considering is very large, and will make a much worse experience for people with rural and slow internet. So simply stop, think, and approach your design from the perspective of different cultures, races, religions, ages, genders, and life circumstances.
I think it's the reverse of the lesson they were trying to teach.
Pedagogically, going purely book- and reading-based like most courses is a bad idea, as that can't capture the paradoxes and nuances involved in ethical decision making. I think the field would benefit from more decision-oriented approaches including a review of past ethical dilemmas perhaps as case studies, more embodied/situated formats like simulations, and practical advice on how to identify and/or avoid getting into ethically compromised situations in the first place. But you do need to couple those with the foundational frameworks that you'd use in those situations, and ideally contextualization with much broader ideas like the social contract in society.
Ethics guidelines from professional engineering societies can help with some amount of ongoing ethical awareness, but I do think it has to start in the formal education system.
But there's a difference between knowing that and having the power to do something about it.
In addition to the new "embedded EthiCS" program you mentioned, the CS program also offers a bunch of more focused classes on, e.g., trust and safety engineering (CS 152); law, order, and algorithms (CS 209); race and gender in Silicon Valley (CS 80Q), fair, accountable, and transparent deep learning (CS 335); computational social choice (CS 366); digital technology and law (CS 481); the Modern Internet (upcoming). And, of course, a much bigger range of classes about engineering, ethics, and public policy offered by colleagues across the university.
The truth, though, is that neither CS 181 or 182 is required per se. All Stanford undergrads have to take at least one course in ethics, and all undergrads in the School of Engineering have to take at least one course in Technology in Society, and both CS 181 and 182 fulfill both of those requirements. But many of our students do fulfill them by taking other classes.
Honestly the ethical questions being brought up are some of the most interesting things happening in tech right now. Society & the human API is like the next abstraction layer for tech, and the dust has hardly settled. It's really created a lot of opportunities to ask ourselves what kind of society we want to live in. Your CS181 syllabus looks great!
At one place I've taught, there was quite a bit of pushback from ethicists against the CS department expanding ethics education in its departmental courses. They viewed this as part of a "CS eats everything" trend that would hollow out humanities and social science departments, as well as diminish the role of a broad liberal education codified in the core non-major-specific curriculum. Instead, they preferred CS to stick to more technical classes, but simultaneously were pushing to include at least one ethics course as part of the gen-ed requirement that all students have to take, with ideally a 2nd course more tailored to type of major. In any case, courses taught by social scientists or philosophers, not by CS profs with a CS course number.
Some of this is just university turf warring, but I think some reflects real differences in opinion on how to structure things. Particularly in the U.S. version of university education, where majors are not as dominant a proportion of total course requirements as in some countries. (Depending on the university, courses in your major are something like 35-60% of the total.)
I guess the good part about a general ethics course would be exposure to students in other majors that think a bit differently, which would hopefully open up CS students perspectives.
On the other hand, a CS specific course would be able to do something like assign students a project to build something, and then follow it up with questions of whether that should be built at all, because the thing in question was ethically problematic.
https://ughb.stanford.edu/courses/approved-courses/technolog...
https://undergrad.stanford.edu/programs/pwr/courses/writing-...
That being said, there has been a major push recently to _embed_ ethics inside the intro sequence.[1] All of the major intro classes (106A, 106B, 107, and 109, to name just a few) have dedicated ethics components.
[1] https://hai.stanford.edu/news/building-ethical-computational...
The prof seemed very uninformed about the computer side of the material (it was taught by someone from philosophy dept). Examples were from like the 80s (cyberstalking people logged into the mainframe via finger and w) and just generally had nothing relavent to any actual ethical conundrum.
But i did learn being a cartoon villian is wrong.
Started binging History of Philosophy Without Any Gaps during the apocalypse. So grumpy that I missed all this stuff. If nothing else, I would have learned that most of our debates in society are truly ancient, maybe save myself some angst.
- academia
- intelligence agencies
- teaching
- various “data science” or “AI” type things (could include eg pricing insurance or selling/targeting ads amongst other things)
- computer programming
- finance (investment banks, quant shops, etc)
[1] A few lecturers started trying to do a few lectures in ethics topics while I was a student but I think they weren’t really a proper part of the curriculum
In college, 1 out of a 1000--10000 (I'm pulling these numbers out of the air) students ever publicilly questioned a teacher who wrong, or unprepared. Yea--I get it. They can ruin your life, esecially the bloated senile fools with Tenure.
And yes--it's easy to be ethical if your are wealthy.
I walked out of a Chiropractic School because Subluxations are maybe 1 in a miiilion, and any success in Chiro is based Placebo.
So many in health care are absolute ethical frauds that fall back on The Art of Medicine in order in order to make more money.
My elderly mother has pain in both shoulders. He doctor's office said the doctor can only exam one shoulder per visit. Just rediculious bill padding. I'm not worried because the pain in in both shoulders, and related to movement.
I won't get started on my Psychiatrist who demands I see her monthly in order to get a prescription refilled. And yes--the rediculious meetings are me giving her $159 cash for a 5 minute session with someone I despise personally/professionally. Why--because I'm addicted to the two highly addictive drugs, and I've been on the drugs for decades. I figure why put my body through a detox at this point. I have to play the charade.
I’m studying computer science in an interdisciplinary build-your-own major style program, focusing on AI ethics. I’m not in any position to make these kinds of claims but I do think that, as you’ve mentioned, these issues will only become more serious in the near future.
At first I was a little worried that not having the traditional CS degree on my resume would hinder me from career opportunities but learning about problems within this space has been incredibly inspiring in its own right.
Ethics required for CS in particular, no.
There is nothing special about a CS degree which requires an ethics course, and this is even if one conflates CS with software development.
If it does, did Mark take it?
If he didn't, that explains it. If he did, the class is useless.
- first year: Mathematics I, Mathematics II, Mathematics III, Electronics I, Electronics II, Digital Circuits, Statistics I, Physics I. The rest was about software and programming (at least!)
- second year: Mathematics IV, Statistics II, Physics II. The rest was about software and programming (nice!)
- third year: software and programming only (very nice!)
So, about 80% of the students didn't pass the first year because of its heavy mathematics + physics content.
Extra:
- mathematics I = logic, Boolen algebra
- mathematics II = calculus
- matehmatics III = Multivariable calculus and something else I don't remember
- mathematics IV = Complex analysis/complex variable calculus
- physics I and II = electromagnetism and friends
In my opinion, this being the only option has had a lasting negative impact on the IT culture in Spain, with many people who worked their way through (i.e. suffered their way through) getting their Computer Engineering degree feeling defensive about "professional intrusion" from people who work in the field without having taken Computer Engineering at university. However, being as I am one of those intruders, I am of course biased.
They already filter out a lot in terms of admissions (you need quite good grades in high school to be able to attend the first year) so I'd wager if the purpose was to train as many people that are capable of being trained in programming we'd see a lot more students graduating every year.
It's a fair point that CS is not the same as "programming vocational school" but seeing what companies use as criteria for hiring junior programmers you can't really blame the students.
True. I don't regret attending (and passing!) all those math+physics lectures to be honest. All the stuff I missed in uni regarding software engineering and programming I learnt them quite fast and easy in my own time (e.g., at least for me after passing an exam full of Cauchy-Riemann Equations and friends, it was quite easy for me to learn Java or to go through books like TCP/IP Illustrated or The Art of Unix Programming in my own time).
Another example is that in my education I think of analysis as being the “pure” thing with a first course consisting of 0. epsilon-delta; 1. sequences, series, limits; 2. Continuity, limits; 3. differentiation, Riemann integration. And calculus is the application of integration and differentiation and probably involves physics and integration by parts and things like Stokes’ law or Green’s theorem and maybe differential equations (unless they go in a separate course). But I understand that at other universities these might all be called calculus.
You need this? Damn the students who could trough through this must be good. IMO only real analysis and complex analysis in that list are real math that deal with a lot of proofs.
I remember really enjoying designing the circuits, then writing machine code for them and seeing it all work at such a low level.
I was like damn they require 4 graphics courses? I avoided those like a plague.
I hope this is a required course. I wish it was a freshman year course for me. I had to pick Unix up on my own (and fell in love while doing so), but a lot of my classmates didn't, and it made group work in the future a bit of a pain. Not that it is there fault, but it would have been nice to lay down an OS framework for students instead of focusing solely on writing algorithms and leaving what SSH is to mystery for a lot of students.
On the general point though, I totally agree. Even after nearly 30 years of working on Windows, learning Linux has been one of the best investments I've made over the past decade. No matter what OS you run locally, doing anything with the cloud, Android, Docker, etc. means understanding the basics of Linux.
Like how many of your coworkers from top CS schools remember most of the material in their compilers, cryptography, comp bio courses?
EDIT: To clarify, I'm not criticizing this approach, I think it's great to expose students to as many subfields as possible.
As someone who is not a CS grad, it’s often difficult to Know where to even start looking for a solution until many years of experience, something that CS grads I’ve worked with and mentored were able to do as interns.
Of course, there’s always the flip side that CS grads need to learn to not always apply the fanciest and “coolest” algorithm that they learnt in college because it isn’t always the best approach to a problem, but that’s a much easier skill that can be learned anywhere within months to a few years given the right mentors.
However, I see the depth of my knowledge in computing isn't that deep.
I can now define what a computer is without fumbling for a definition.
10 years in, I find that many individuals fall into a trap of having forgotten many concepts while also thinking that they weren't useful in practice and a bad memory of having to learn/crunch the topic.
This was a significant difference from my experience where most concepts I only picked up as I found them useful/interesting to my work. As such I generally have a sense of pride/enjoyment from seeing an optimal algorithm or simplification of a problem based on concepts in the literature.
I think the 4 year CS curriculum could be revamped to focus on semi-practical projects with less focus on individual topics. Crunching algorithms for 2 semesters probably makes aspiring engineers feel that they are simply memorizing pages from a book which are trivially indexed by google.
I realize that the majority of engineers will never need to use any of the more advanced topics taught in an algorithms class, but I hope you recognize the irony in this comment; the “trivial indexing” performed by Google is anything but, and, in fact, is only enabled by those very algorithms, implemented dozens of times, in multiple languages, with subtle variations and optimizations and under non-obvious reinterpretations, at every level of the stack.
For example, I studied Greek before software engineering. I've forgotten quite a bit, but theres an entirely different set of thought processes I have access to while doing software engineering because of it.
I've heard this over and over again, but I don't believe there's a shred of evidence for it.
Analytical thinking and pattern recognition is indeed also a key benefit of education.
Do I make use of all the material I was shown? No. But it is really nice to have that universal background which, for the majority, I would never have studied on my own. You could ask the same question about middle school or high school - do you really need to know about biology, language or arts to be successful? Do you remember many details? Of course not; general knowledge is still incredible valuable.
Material has to be covered repeatedly in a series of courses building on each other. E.g. first you learn basics. Then you apply it in subsequent classes. This is how mastery in learning works for anything. One class on an isolated topic is probably a waste of time in the long run, unless it really makes an impression on you for some reason (e.g., you really love it).
Some programs, especially overseas, let people mash together a broad range of classes on disparate topics with mastery in nothing (except perhaps for skill at cramming itself). Those are almost worthless degrees.
If you don't put knowledge into practice it all goes quickly.
I'd rather take less courses and focus better on some
on the other hand this approach allowed me to graduate faster
1. https://www.youtube.com/watch?v=rS6l7p86cyw | How I got engineering jobs at Apple & Nokia with no degree
Nobody forgets a compilers course.
A "compilers" course is probably the first CS course where debugging is real--and terrifyingly hard. A compilers course converts a programmer from a "null pointers are bad" person to a "null pointers are evil" zealot.
Compilers courses are probably the closest that a CS person will get to PTSD.
I've taken a compilers course, at Stanford no less.
I've written a couple of compilers and some near-compilers. (A very fast simulator can be a lot like a compiler.)
I don't think that null pointers are evil. In fact, I like null pointers.
My beef with null pointers is that very few languages support multiple null pointers. (No, mocked objects or sentinels are NOT a good substitute.)
Yes, I want multiple isNull values that can be distinguished but can't be used. (Python's "lots of things are false and you can create more" is arguably the closest.)
But the curriculum I've been increasing into lately is that offered by the Design Group. And that seems to be a carefully shrouded secret ;)
I've noticed that interesting classes like SICP cs61a from Berkeley still take place online (their material is available), but are no longer available on the MOOC platforms. The same goes with some interesting MIT classes (Introduction to Computational Thinking)
(Although a certificate from such platform doesn't mean that much to me, it does help somewhat with motivation and looks better on a beginners resume than nothing. )
You may meet great ones or terrible ones, just like with everything.
I have a CS degree (from 25 years ago), and I wish I could go take all of these classes again.
• CS 103 and 109
• CS 106B or 106X
• One of CS 181W, 182W, 191W, 194W, 210B, or 294W
• One of CS 107 or 107 E
• One of CS 110 or 111
• CS 161
• A senior project, which seems to fall under any of several course numbers
• It looks like you have to pick a "track" (AI, Biocomputation, Graphics, and a few others) and take 4 or 5 classes from that track.
(That is just CS classes. There are also some required math and physics classes).
(I specifically said from the School of Engineering because I don't happen to know if all Stanford CS bachelor's degrees come from that. Some schools offer a degree from more than one school/college, sometimes with different requirements).
[1] https://exploredegrees.stanford.edu/schoolofengineering/comp...
In most software development courses, the student is learning how to make something (and then after that is done, its thrown away for the next homework assignment).
System design is often about writing the glue between different constraints - frequently through another constrained component... and then having to live with the consequences of that design for a year or more (possibly trying to fix it).
Take the "I've got a relational database here with mixed transactions and record updates and a document database there that I want to reflect the current state of an object in the relational database." And so you get to figure out how to use GoldenGate ( https://docs.oracle.com/goldengate/c1230/gg-winux/GGCON/intr... ) or Postgresql to amqp ( https://livebook.manning.com/book/rabbitmq-in-depth/chapter-... ) and then write something that consumes that and writes it into CouchDB or MongoDB (which do you chose? why?)
Once you've got that working... keep it working for a year or two.
That's how you learn system design.
So much of system doesign is understanding what your 'actual' problem is, and then thinking it through, looking for what others have done, and then bringing it together with your team knowledge.
MIT 6.824: Distributed Systems https://www.youtube.com/watch?v=cQP8WApzIQQ&list=PLrw6a1wE39...
CMU The Databaseology Lectures https://www.youtube.com/watch?v=GkgDDs9EJUw&list=PLSE8ODhjZX...
You essentially learn systems by looking at lots and lots of examples of how good real world systems are designed.
This course is incredible. It's short, and it's a course aiming to teach people how to ace their systems design interview, yet (perhaps unknowingly) teaches you almost everything foundational you might need to know about systems design and the reasons behind each choice.
Intro core systems include 106B, 107, 110, and the newly introduced 111.
Happy learning!
I thought it would be useful to the HN community given its high signal-to-noise ratio:
1) You can get a quick birds-eye view of the general trends / topics that are currently being taught at the Stanford CS department.
and
2) You're one click away from learning more about each topic if you wish to do so, considering all of the courses listed have publicly accesible websites.