
Computer Sciences Courses That Don't Exist, but Should - Scramblejams
http://prog21.dadgum.com/210.html
======
insaneirish
Can I add another one? How about "The Network Doesn't Work The Way You Think
It Does: A Distributed Systems Survival Guide".

As someone who has spent a good chunk of their career building high
performance networks and another chunk of it working closely with developers
who care a lot about those networks, I'm constantly amazed at how little top
tier graduates from well respected schools know about networks.

Relatively basic stuff, like what does your application's traffic look like on
the wire, how an OS determines what to do with a packet, how latency affects
applications, and many other things are completely foreign to way too many
developers. I could go on and on, but given the connected nature of things
today, it seems like a very overlooked area.

~~~
testaccount17
I am a recent CS grad and I am constantly amazed by how little I know about
networks. Do you have a favorite book or online resource on the subject?

~~~
jzwinck
One fun thing is to download Wireshark and look at the packets being sent in
detail when you do common things like browse the internet or use FTP.

~~~
insaneirish
I think this is a really good idea, but I'd add one alternate possibility is
well. Doing this on a typical user's computer today will present a mind
blowing amount of data--so much that it is easy to give up trying to figure
out what's going on if you've never done it before. Instead, perhaps spin up a
Linux VM, maybe even no GUI to start. Then run Wireshark on its interface.
Much less noise. Should be much easier to begin dissecting.

~~~
jzwinck
No need for a VM, just do some filtering in Wireshark. This will help you
understand even better what is possible (filter by IP, port, and many other
things).

------
bliti
CSCI 0666: Implementing Reverse Binary Trees on whiteboards.

CSCI 0123: Implementing Monads in COBOL

CSCI 0555: Successfully correcting internet commenters.

CSCI 0556: Nitpicking points made in CSCI 0555.

CSCI 0777: Introduction to twitter bot polynomial time algorithms with an
emphasis on winning shitty contests.

CSCI 0911: Learning functional programming with Haskell.

CSCI 0912: How come up with uses for knowledge acquired in CSCI 0911.

~~~
prostoalex
> CSCI 0666: Implementing Reverse Binary Trees on whiteboards.

Not of much practical use later in life, but an A in this course guarantees a
technical interview pass with any major Silicon Valley company.

~~~
SamReidHughes
It's just a warmup question.

~~~
jschwartzi
Here's a list of all the algorithms and data structures I've actually needed
to implement by hand so far:

~~~
SamReidHughes
Fascinating. Taking the restricted definition of "algorithm" you seem to be
using, here's the first few I can think of that I've had to implement (for
money):

\- Converting a dollar/cents value into text, e.g. 67.33 -> "sixty-seven
dollars and thirty-three cents", in XSLT of all things. I wrote the first
version in Emacs Lisp, then translated that to XSLT. I was working on manually
translating a bunch of .doc files to a new layout for the automatic generation
of contracts, and the vendor had supplied a version that, after reading its
source code, I realized was broken on certain inputs, like 10001 or something.
I guess it was made by some people that thought they'd never need to write
algorithms when working as a software developer.

\- I was asked to combine the information in a few spreadsheets with several
thousand rows into a new one. I ended up needing to compute some statistics on
certain ranges of a set of rows, so in my short Perl program I sorted the data
by the relevant key and used binary search to find the ranges.

That's not a list for my whole career, that's just what I can remember from my
first summer internship as a data entry/IT hob-job monkey when I was a
teenager.

------
fizixer
Okay time to upset people:

Dear 'All CS Departments of the World':

Please stop fooling your students in the 'Intro to Algorithms' class, and just
rename it to 'Intro to Combinatorial Algorithms'. Because that's what you
teach, and you completely ignore the arguably bigger area of 'Intro to
Numerical Algorithms'. Numerical Algorithms, that are not only the basis of
pretty much every branch of computational science (comp. physics, comp.
chemistry, comp. biology, comp. civil engineering, comp. mechanical eng.,
comp. electrical eng., comp economics, comp. statistics, and on and on and
on), but it's also one of the weakest link for a CS graduate to transition to
Machine Learning and Data Science.

Or you could keep the course title, but upgrade the class, by teaching 50% of
it as 'Algorithms and Data Structures', and 50% as 'Numerical Methods and
Scientific Computing'.

Unrelated to above but relevant to the thread: Allen Downey and his team at
Olin College are doing things worth looking into. (His Google techtalk:
[https://www.youtube.com/watch?v=iZuhWo0Nv7o](https://www.youtube.com/watch?v=iZuhWo0Nv7o))

~~~
tonyarkles
Woah woah woah, are you suggesting that computer science classes should teach
people how to compute things?! That's ridiculous! :D

~~~
pjmlp
In Portugal they do.

There is hardly any pure CS like it appears to be the US case.

All Informatics degrees are actually a mix of CS and Software Engineering.

For pure theoretical CS one needs to go for a Maths degree with focus on
computation (after the third year).

EDIT: Typo the => be

~~~
euyyn
Same in Spain. The degree is 5 years long (rather "was", now Bologna has
changed all that) and teaches you all the way from the wire to A.I.

------
WestCoastJustin
How about "Building an End-to-End Software Solution - 101". Going through the
entire development workflow (idea, design, prototype, beta release, delivery,
and iteration). One of my good friends is currently going through school, but
in the back of my head there is this nagging thought, that he will not learn
what's needed for today's market.

~~~
ggchappell
We have that in our CS program. We call it "Senior Capstone". I'm sure others
have it, too.

~~~
Turing_Machine
Same here. We had to design and write a significant real-world application.
You could suggest your own idea or take on a project that the profs had found
through their connections with the business world. Either way, you had to
convince the professors on the committee that it was worthy of receiving a
full course's worth of credit (though most people wound up spending far more
than that amount of time on it).

------
ctdonath
CSCI 1200: Debugging

Seriously. This should be a full subject addressed in detail, and early, unto
itself. Instead it's typically a sink-or-swim byproduct of trying to pass any
other science/engineering class.

~~~
girvo
Agreed. Debugging is an art and discipline in and of itself, and one that so
many developers lack. In the last couple of years I've taken a great interest
in learning to debug efficiently, and yet despite my best efforts most web
devs I work with still rely on variations of "printf debugging". A shame
really, considering the sheer depth and breadth of tools that are available
these days, even in languages like PHP.

~~~
burkemw3
I totally agree with "Debugging is an art and discipline in and of itself" for
issues that are difficult to reproduce. With a reproduction, debugging should
be straightforward for any engineer.

For reproducible issues, it's scientific method plug and chug for me: observe
an interesting behavior, theorize about cause, test, rinse, repeat.

Unfortunately, I am too often amazed at the engineers that don't go through
this exercise before asking for help.

~~~
fr0styMatt2
For those 'hard to reproduce' issues, it's about knowing what debugging and
forensics tools are out there and making sure that the systems you deploy
support postmortem debugging and issue analysis. Things like creating crash
dump files, then giving your field technicians or customers an easy way to get
this data to you with an incident report (or even having the system do it
automatically if applicable); logging systems that can be left switched on all
the time and dynamically reconfigured (so that there's less chance of the damn
thing being off when an issue does occur).

Also awareness of things like tools that analyze or try and provoke race
conditions, etc.

------
stormbeard
Seriously though, it's probably time to separate Computer Science and Software
Engineering into different routes of study.

~~~
zatkin
RIT already has done this.

~~~
zachberger
And CMU, ASU, Penn state, etc.

\- signed RIT SE Grad

------
blt
It's not enough to fill a class, but I really wish school had taught me about
linkers, dynamic libraries, and calling conventions. AKA "why must I use this
old compiler to link against this old closed-source C++ library?"

~~~
Jach
Really this should have been part of your freshman C course. (Happily it was
mine, like right at the beginning alongside Hello World.)

~~~
serge2k
ha, freshman C course. Good one.

My school switched to Java and graduated more than a couple people who don't
really get C at all.

Should be taught in OS. Really, it should be taught in a practical sense in an
OS lab.

~~~
xxpor
My OS class at least didn't even come close to covering that sort of stuff.
Half the semester was on concurrency primitives and System V IPC :(

~~~
zyxley
Same kind of thing here. System calls, concurrency, etc. Nothing at all about
linking.

------
arfar
>UNIX "ls" tool is a case study in excessive command line switches.

'ls' is a bag of weird (bad?) UX. When first starting on the command line, I
could never figure out how grepping the output of ls actually worked. Then I
think I looked at some of the code, or someone told me, that when ls outputs,
it checks to see where the data is going, if it's STDOUT then it pretty prints
columns (and probably other things), otherwise it just the more sane 1 line
per item.

~~~
steckerbrett
Here I am using `ls -1` for years without realizing the redundancy.

~~~
nocman
Don't feel too bad. I didn't know until reading this that sending the output
from ls somewhere other than stdout would cause the output to be one-item-per-
line either, and I've been using Unix and Linux platforms for a _very_ long
time.

If I wanted that behavior, I would have typed 'ls -1' also.

------
Tloewald
Unlearning Object Programming might include discussion of the legitimate uses
of global variables, and how Singletons are just obfuscated and inconvenient
globals.

~~~
crdoconnor
>discussion of the legitimate uses of global variables

Short course, that one.

~~~
Tloewald
Module names are, effectively, global variables. The reason global namespace
shouldn't be polluted is that it's so damn useful. Not using it for anything
is like never driving your car to avoid wearing out your tires.

~~~
crdoconnor
>The reason global namespace shouldn't be polluted is that it's so damn
useful.

No, the reason is because the more interacting components you stick on it, the
harder your code becomes to reason about.

It's more a restatement of the notion that software should be loosely coupled.

~~~
hvidgaard
There is some state that is global. Current user for instance, it is used
globally, so why create a complex way of passing it around instead of just
making it global?

~~~
gohrt
I once worked on a system that had more than one user logged in at the same
time, and my global variable got soo confused.

~~~
Tloewald
And your singleton user class worked better because?

------
yakult
How To Prevent Scope Creep Without Alienating Your Boss Or Other Important
People

~~~
hvidgaard
In my experience it's not that bad, but you have to speak in their language.
An agreed spec and deadline is a contract, and now they want to get more for
the same price. I'm sure they wouldn't let a customer do that, so they
understand that if they want to change the content of the contract, they have
to negotiate.

That of course require that you have a sensible manager/boss, that doesn't
force it his way.

------
piyushpr134
How about 1\. Version control systems and how to use them always 2\. Practical
introduction to sql and nosql databases 3\. Database schema design along with
practical projects 4\. Introduction to HTTP 5\. Introduction to Web frameworks
6\. Introduction to mobile development 7\. Mobile app design basics 8\. How to
clear job interviews

?

~~~
dredmorbius
There's theory and practice.

When I started with computers in the dark ages (mid 1980s), there _might_ have
been RCS and SCCS... Yes, SCCS actually dates to 1972. RCS from a decade
later. CVS ... woah, _that_ is also an 80s kid: 1986, wasn't something I
encountered1until later. Ah, initial release 1990. Subversion came along and
changed everything in 2000, mercurial in 2005. I remember some heated Hg,
arch, and Git debates for a while.

Unfortunately, I've got (bad) habits from most of these stuck to different
layers of my brain....

Databases _may_ be going through similar revision (though you'll still get a
fair bit of mileage from 5NF.

HTTP may or may not be due for major revisions given variously:

1\. Calls for distributed Web.

2\. Issues with presentation and form factor.

3\. Conflicts between _document_ and _application_ presentation.

4\. Privacy and security.

Web frameworks change too quickly to be worth teaching. Best learn general UI
principles. Dittos mobile apps.

~~~
piyushpr134
See it is one thing that the tool you have been taught becomes obsolete and
quite another that you are not even familiar with the concept of http, vcs,
and sql. It is far more easier for somebody who knows mysql to understand and
come upto speed on a postgres/mongodb than somebody who is not at all exposed
to these concepts.

Moreover course curriculum needs to be updated every 2-3 years when such
courses are taught to keep them relevant

~~~
dredmorbius
Actually, in my case I'm _not_ formally educated in compsci. A couple of
programming courses but picked up what I know on the job. It's fairly
effective.

------
jnpatel
> Includes detailed study of knee-jerk criticism when exposed to unfamiliar
> systems.

This hits home.

------
thinkingfish
CSCI 4035: Refactor Your Own Term Projects from Past Semesters

~~~
xerophyte12932
My Almameter seems to be doing that this year in their Design Patterns Course.
The task is to find a large code base that desperately needs refactoring. I
let a young friend use my old Final Year Project for this. Its scary how bad
my code was when I graduated (never took Design Patterns) but at the same
time, inspiring to see how far I have come since then

------
solomatov
I think, another course should be CSCI 9000: How not to be opinionated jerk.

~~~
tsumnia
I think if you force CS students to take a few business courses (or MIS
courses), it can help dissolve the 'opinionated jerk' [elitist] stereotype
that can come from CS students. They see that software development is only a
piece of the puzzle and while they'll never have to worry about handling
insurance, someone who didn't spend classes learning code has learned this
task for them.

~~~
ebiester
You must have had different business classes.

The one class I had with business majors, I was completely underwhelmed as to
their capabilities. I was amazed at having an upper division course that had
such atrocious writing and thinking skills.

~~~
tsumnia
Its actually more along the line of I currently am teaching the 'Intro to IT'
course required for all business majors. In one light, the course is about
making the rest of business understand what IT does; however from an IT
student perspective, it should also let them see the other side.

Each week I'm mulling over how to connect with both sides of the table, since
I have both sides in my classroom.

------
xacaxulu
Maybe just a CS program staffed entirely by people who've had real CS jobs
outside of the academia bubble.

~~~
visarga
You mean software engineering jobs?

------
andrewstuart
How about "Programmer psychology: recognising and dealing with your own
dogmatism through to diplomatically dealing with the dogmatism of other
programmers."

~~~
louithethrid
If you cant profile it - it doesent exist.

------
notacoward
CSCI 2020: How to Store Data

Discover the fascinating differences between fflush, fsync, and data actually
hitting disk. Learn why single-byte writes are a dumb idea, and why accessing
data through a cheap one-gigabit switch might not be as fast as accessing it
locally. As preparation for being actual storage developers, students will be
blamed for the professor's own mistakes, and for every problem that happens
anywhere else in the system.

~~~
AnbeSivam
I am interested in learning this. Are there any books/study_material
available, that you recommend.

------
thetruthseeker1
I am a software engineer, I have a grad school degree in CS with many years of
experience in the industry. One thing I often noticed was many people break
some key computer science concepts while on the goal to achieve some minor
usability improvements or some other minor goal such as code reuse.

There was one instance where in a multiprocess environment, one of the
engineers wrote some library to access a database table and read its contents.
In the process he/she maintained a cache of it in memory. Then somebody else
decided to use that convenience library/methods in a different process and so
on.., essentially cache coherence problems were left unsolved and when I
brought this to the attention of people they shrugged it off saying when they
see a problem they might handle it - which may be fine, but seemed like some
key computer science concepts were overlooked in the goal to achieve software
reuse (here reuse of existing accessor/cache code to the database)

I have seen design choices that cause race conditions or non-determinstic
behavior, following some patterns or cargo cult programming because something
is an industry trend etc.

------
simonw
I love "Unlearning Object-Oriented Programming".

~~~
iyn
I've seen so much criticism of OOP, can somebody provide more details/valuable
links why "OOP is bad"? Honest question.

~~~
cam-
In real world business logic and modeling you have to work really hard to make
it fit into an OO paradigm. It also gets hard to manage long term as your data
structures kind of get stuck with all the restrictions that OO allows you to
make. Javascript object literals are fantastic as they make data transfer
objects simple, fast and not polluted by business logic. Once you get used to
passing around DTOs that way then a functional style of programming becomes
more useful. For the most part programming is getting data from one domain
data model and then converting to another domain data model, OO doesn't really
help there, and if anything is a hindrance. Unfortunately software engineers
love to abstract to the nth degree so sometimes you get stuck with tight OO
models of DTOs and transformation layers.

~~~
mikerichards
I think one of Rich Hickey's quotes expands on your point:

 _It has always been an unfortunate characteristic of using classes for
application domain information that it resulted in information being hidden
behind class-specific micro-languages, e.g. even the seemingly harmless
employee.getName() is a custom interface to data. Putting information in such
classes is a problem, much like having every book being written in a different
language would be a problem. You can no longer take a generic approach to
information processing. This results in an explosion of needless specificity,
and a dearth of reuse.

This is why Clojure has always encouraged putting such information in maps,
and that advice doesn't change with datatypes. By using defrecord you get
generically manipulable information, plus the added benefits of type-driven
polymorphism, and the structural efficiencies of fields. OTOH, it makes no
sense for a datatype that defines a collection like vector to have a default
implementation of map, thus deftype is suitable for defining such programming
constructs._

------
hackerboos
These are Software engineering mostly and not CompSci.

~~~
mikerichards
Which is sadly, too often lacking at many universities.

~~~
rifung
I suppose it's a philosophical argument more than anything, but I don't think
it belongs universities. I don't think universities should be career schools,
although I can see why others might think it should be since most people do go
to school as a prerequisite to get a job nowadays.

------
jason_s
Robot Odyssey!!!!!

[https://en.wikipedia.org/wiki/Robot_Odyssey](https://en.wikipedia.org/wiki/Robot_Odyssey)

------
smrtinsert
COMP000 Your Job Isnt Only Fun Shit

------
bb0wn
This would more aptly be titled 'Software Engineering Courses That Don't
Exist, but Should.'

------
cLeEOGPw
These should exist if universities had a goal of producing not scientists, but
workers.

------
matthewbauer
CSCI 0201: Principles of Version Control

~~~
serge2k
So what do you teach for the rest of the semester after the first week?

That's the problem with teaching these things in university. They just aren't
worth the time and money to teach at that level.

~~~
viraptor
How about "How does development work in practice" that covers version control,
debugging, documentation, dependencies, packaging. After that any project (all
courses) involving more than 100 lines of code MUST be handed in as a
repository that actually contains the development history, not a single-commit
dump. Also installable as a proper language-specific package, rather than "put
the path to the project in those two places, then run this script".

~~~
frobozz
In each of the degree courses I have done, there have been a few sessions on
general scholarship, essay-writing, etc. These are not actual modules, parts
thereof, or even evaluated, but just part of the furniture of the whole
course.

What you describe sounds like the kind of content that belongs in such a
session for degrees that are likely to lead on to working in software
development.

This gives rise to a further thought. Rather than this even being part of a
degree course, it should be something run by a university's Careers Service. A
series of "So you wanna be a ..." sessions for common graduate careers, that
train students on some of the day-to-day practicalities of what those jobs
entail.

------
FrankenPC
Reminds me of a question a help desk person asked me about 20 years ago. They
were having all kinds of problems printing word docs from this new windows 95
PC. I was busy at the time so rather than educate them on the nature of
WYSIWYG I just told them to update/repair the graphics driver. It worked and
they thought I was a god.

It's hard to create a course on the interconnections of everything. The best
course I ever took was a Cisco IOS programming course. That included protocol
analysis, debugging routers, switches, etc. I'm not a network layer
programmer. But what I learned about how everything works together has helped
me solve complex problems ranging from Kerberos authentication issues to
finding duplicate DHCP servers on the same network. Without this knowledge, I
would have to hire experts and waste a ton of time and money to get to the end
goal which is a functioning product.

------
bwang29
How about a "class" or some pre session on best practices of typing on the
keyboard in the CS departments?

For year, I'm still struggling to type without looking at the keyboard and I
make frequent typos which slow me down. Being able to type quickly and have a
good habit of placing fingers on the keyboard seem to be an important
exercise. A guideline to choose the right keyboard, setting up personal
shortcut or customized keyboard layout for each developer might also be worth
learning.

~~~
tsumnia
Interestingly enough, this semester, I've begun including images of
programming code that I force my students to type out specifically to give
them typing exercises. There's no errors, and they're variants of stuff from
the books so they don't copy and paste from a PDF. My logic is that while CS
is mental, typing the code is still a physical activity we use. Like any other
physical activity, the best way to get better is to drill the motions until
they become second nature.

While there ARE typing tutors, I haven't found any programming specific typing
tutors. I think a normal typing tutor is nice, but since syntax requires so
many symbols, typing English sentences only helps so much. I also think (still
in the 'physical activity' mindset) developers can use these typing exercises
are warm-up exercises. Just like a sport, you stretch and warm-up so you a
loose and ready. Typing out basic for loops and functions can help in the same
light.

~~~
kevan
Have you checked out typing.io [0]?

[0] [https://typing.io/](https://typing.io/)

~~~
tsumnia
I have, and I hope they succeed (cause I'm building something similar!). I do
think drills might be helpful, from a student's perspective, since they are
still learning proper syntax. From a professional's perspective, typing
whatever can help if you work with niche libraries (like Unit Testing)

------
spydum
Automotive Metaphors and analogies for programmers

Seriously, why does every analogy have to be a car? Is it just the most
complex system we can model in our heads?

~~~
Turing_Machine
Hey, sometimes it's a recipe, and sometimes it's a telephone system. :-)

------
msoad
Where I come from Software Engineering and Computer Science are two different
paths.

------
zyxley
I'd like to suggest a course in: how to argue with management about system or
vendor implementations that you know will affect both future development time
and user experience within your company.

~~~
tonyedgecombe
Absolutely, I spent quite a few years on the other side, implementing systems
for a vendor. We rarely had technical problems but usually encountered some
kind of management failure, from either side.

------
thinkingfish
CSCI 3350: Debugging- Beyond Print

CSCI 4600: When Big-O Complexity Becomes a Lie and Why

------
smegel
CSCI 2550: Software complexity and the art of Keeping It Simple.

------
kevindeasis
CSCI 099: How to apply what you learned in comp sci.

------
garfieldnate
I would take that classical programs class in a heartbeat. That seems like
something that could be organized online somewhere.

------
2sk21
No disagreements except that I might rename "Classical Software Studies" as
"Software archeology"

------
asgard1024
Classical software studies? What about System 370, CP/CMS, IMS, CICS? There is
so much that was forgotten.

------
pjtr
CSCI 0001 'RTFM & Learning simple facts yourself outside a CS course'

------
EugeneOZ
"I'm so cool I'm going against the crowd" bullshit.

------
gull
How to program by listening to your intuitions, not logically.

------
kriro
CSCI 3300 kind of exists in human computer interaction.

------
loaaa
Another course should be network security for everyone

------
jecjec
How about:

-Mastering Git (/competitors)

-Refactoring

-Project Management

-History of consumer information technology

------
alt_f4
CSCI 2100: Learning how to hate on OOP

CSCI 3300: Stuff no one cares about anymore

CSCI 4020: Pretending to write fast code in slow languages

CSCI 2170: I know about command line tools !1!!@ So h4x0r

PSYC 4410: Trivia

Seriously, this article is garbage

------
dave_chenell
this is so good

