CS Unplugged – Computer Science without a computer
csunplugged.org
csunplugged.org
Later on I realized that most jobs that ask for a CS degree don't actually have you doing any computer science. More often you are glueing together tools or writing a bunch of boring business logic for some specific application at best. At worst you are maintaining an old monolith trying to figure out someones logic from 15 years ago.
Having a CS background in most software jobs is useful in the same way having a chemistry background is useful to someone working as a nurse. Sure there will be situations where that knowledge might help you make a connection more quickly, but you're sure as hell not a chemist.
As for the whole school cost, that's a different story, but we landed in a lucrative field where we can pay off the debt, compared to a ton of others that have no hope to without a career pivot.
Maybe, but I can't really think of much that I learned in college that I have ever used since then. Everything a typical programmer does can be learned with just a textbook and/or the Internet. Beyond that, it's just years of practice and continual improvement, which you won't get in school.
All the CS classes I took (DFAs, state machines, Turing machines, programming language theory) were a complete waste of time for a programmer, and the actual useful stuff (programming courses, systems architecture, networking) I picked up in my free time in middle/high school. I'm sure it's all great stuff if you want to be a computer scientist, but I didn't and don't.
I think the only classes I took in school that I consider useful and that would have been challenging to pick up on my own were the coding theory[1] and intro to crypto classes. That's pretty poor showing for four years and a ton of cash.
[1] Not programming, but number theory stuff, basis for cryptography https://en.wikipedia.org/wiki/Coding_theory
You are absolutely right. Literally every single thing a programmer does, every bit of information they use, and every other thing they might use or need to know can be found beyond the ivory tower. It's all there. In fact, often the problem is less getting information and more figuring out what information is relevant.
Is it possible that some people may find value in a structured educational process? One that has already organized and worked out how to teach the fundamentals? I suspect that many people, pointed at the internet in general, may experience some difficulty in figuring out what to study and in what order.
As for material, I've personally found DFAs, FSMs, algorithmic analysis, and an understanding of computer architecture to be valuable to my career. I found a lot of basic theory useless, until I encountered cryptography that required me to understand a lot of theory to grasp fully. Obviously, personal mileage can, does, and will vary greatly.
It's been my experience that a CS degree is used as a certification for a broad array of fundamental skills. A lot of theory is, as you say, useless most of the time. But sometimes it can be important to have a grasp of how hash algorithms work under the hood. Though how well this degree-as-certification idea actually works is open to debate. I've definitely seen it fail.
It's been my experience that it's rarely obvious to people operating in ignorance when a grasp of theory would make a big difference. This can make it challenging to fall back on the model of looking up information as needed.
For a course, I'd start with how a computer works, something simple like a 6502 CPU with a memory mapping; how assembly represents those operations; how higher level languages abstract that; how computers represent different types of data; then move into some overview of languages in common use today; algorithms and complexity analysis; good code hygiene and development practices; common tools in the Unix and Windows worlds. Once you've got all those basics you can move into focuses like graphics, security, web apps, data storage, operating systems.
Can you imagine what it will be like 15 years from now, when we're trying to maintain someone's microservices with their logic smeared out across dozens of distributed API calls, storage backends, and code bases?
B-U-T... All those if's probably don't hold. Good luck, future code monkeys!
Well-documented is the biggest lie of any project. Unless you document it that is, in which case it's the only well-documented project.
At least it's all in one process / one codebase.
We do have some slightly better for managing the logistics though. Small force multipliers can add up to quite a lot in aggregate.
There are two immediate counter-arguments to this. First, you don't go to the university to learn how to do something which you're going to do at a job, but you go there to get education, and that's quite useful for both professors and practitioners alike. Getting education is a wider idea; it's a mind training to deal with variety of problems, including lack of education, in any area. Second, sometimes you're reminded that there is nothing more practical than a good theory. Ken Thompson's regex matching engine is one of illustrations of the concept; but in general, many things you learn at a workplace are specific and temporary (adjusted to current conditions) while many things you learn in university are permanent and general, even though they can look differently in different applications.
For example I teach databases and one of my first year tutees comes to my office hours and asks me for advice implementing the database part of a website he is working on. He is the only one who bothers coming so I spend an hour every week whiteboarding database design and optimisation with him, and explaining how to design the architecture of his app. Another one comes to me on a regular basis and seeks my advice on machine learning (my field of research), and I give him guided readings and advice on adding some light ML in a game he is working on. Both of them will get a lot more of their education than theory and research, because they understand that what they are paying for isn't a weekly one man show of some dude standing on a podium and talking for a couple of hours, it's access to expertise.
It's almost like trying to turn a carnivore into a vegetarian - not impossible, but the taste of warm flesh may be hard to forget.
Yet the premise is the vast majority of jobs don't need a computer scientist. They need a programmer who can understand a complex code base and explain why is it taking so long to display user's birthday on the settings page [1]
CS Guy: Yeah well TCP windowing should work like <insert something here>, so why does this not work?
Me: Yeah I think I know what you're saying but when you put everything all together ... TCP doesn't work that way. Here, I'll show you how you fix this problem, why you never use this configuration again, and ... you explain to me some of those fancy words you used ...
It was a good combo.
If you’re a programmer who doesn’t know any CS at all, you probably have a lot of room to improve.
Kind of like a chef who only uses frozen foods and then doesn’t understand why things taste weird.
If you're a programmer who doesn't know any CS, you are likely unaware of what you don't know. Googling for what you don't know is remarkably unuseful.
> More often you are glueing together tools or writing a bunch of boring business logic for some specific application at best.
That explains their mindset. They are not doing much of anything that would require CS (or maybe they picked up enough and don't want to label it as CS for whatever reason).
I agree with you, this mindset is not good for our industry. It's fine that there are jobs out there that require a programmer who doesn't have much theory/background, but the mindset that CS is somehow not needed for our industry is just wrong. If only there was more focus on theory and building a good foundation for us then maybe we wouldn't have all the problems that we have now (who knows though).
Like your chemistry example. There's chemistry, and then there's chemical engineering. Chemists worry about the properties of atoms and molecules, and reactions that move from one state to another, and about the energy differences in reactions. Chemical engineers worry about how to efficiently make the stuff in multi-ton quantities without blowing up the city. It's related, but it's really a different set of concerns.
In the same way, CS worries about the efficiency of algorithms, and about what things particular language features make easier or harder to express. Software engineering worries about how to efficiently construct and maintain larger programs that adequately do what is needed. [1][2]
The thing is, almost everyone who graduates with a CS degree is going to be employed as a software engineer, not as a computer scientist. I fear that their education is mostly preparing them for the wrong thing.
-----
[1] Or perhaps, "construct less inefficiently" - there's inefficiency no matter how well you do it, but you have to control the amount of that, or it will destroy you.
[2] Note that I said that they "adequately do what is needed", rather than bug-free. Larger programs are never bug free.[3]
[3] Well, almost never. You can get there with formal verification, if you have a bug-free specification, and if the formal verification covers every relevant category of bug. But that's really difficult to do, and we're back at the "less inefficiently" issue.
Socrates said it best, "The true knowledge consists of knowing that one knows nothing".
But that being said, there are a ton of interesting areas with respect to computers and programming. Pick one or pick several, keep an open mind, try to learn from whatever source you can (Books, classes, articles on the web, self-experimentation, etc.).
It doesn't matter where you start... just start! <g>
Also, if one book/class/teacher/article is too difficult -- find a simpler one, or one that simplifies the topic, and learn from that one first!
Then, Lather, Rinse, Repeat, and eventually you'll have 12 PhD.'s, like most normal people who are computer/programming enthusiasts(!), ...or you'll become a reclusive crackpot like myself! <g>
(Shakespeare: "Much learning doth make thee mad!"... well, that's what happened to me! <g>)
Anyway, wishing you well in your quest!
IMO CS is the right core thing to learn; software tooling & frameworks are easily picked up interning, in on the job training, and are more professional development than core knowledge.
If you compared an education in building a state of the art webapp vs. CS theory today, in.. idk, even just ten years, the webapp tech would be obsolete and the CS theory would likely be as solid a grounding then as it was twenty years prior.
CS != Code, as a previous poster suggested.
CS != Business aspects of software development.
CS != Guarantee that you'll get a job you'll like as a programmer, or even a job as a programmer.
CS != Guarantee that you will be able to fix systemic problems in systems, understanding, culture or process in corporations or other organizations, by fixing code.
CS != Guarantee that you'll launch a successful website, or start a successful startup.
CS != Guarantee that you'll be able to raise venture capital, or be able to sell enough to gain your first customers to become "ramen profitable".
CS != Guarantee of success, or that you'll get what you want in life...
I am 99.44% self-taught -- my opinion is that CS degrees are overvalued and overpriced, but that being said, they're not wrong for everybody...
Most of the stuff I use (languages, tools, frameworks) I've learned myself. But CS courses have taught me a lot, I have a deeper understanding of how things work and I can solve hard problems, I know instinctively where to look to solve an issue, and what I need to research to make things work as they should.
Based on my experience, employers tend to prefer people with CS education over people without, if that is the only difference.
Also, talking with my peers, I have the sense that people with formal CS education managed to negotiate better salaries.
Also, I my country, programmers with degrees in CS have lower income taxes.
For me it payed big time to spend that time learning, even if in the first two years when the courses seemed boring I did have the opinion that I was wasting time.
Some of my colleagues dropped out to work in the industry, some were working and studying in parallel. Those who dropped out have a harder time now. They have a harder time finding a good workplace and they have lower wages.
Would you agree to undergo surgery by a self taught physician or you would trust more one with formal education?
?
Look, more power to you if you have a CS degree.
Sure, they can open doors, I agree. If I were an employer, and I had only two job applicants to choose from, and the choice was between someone with a CS degree and without one, and there were no other differences, nothing different in the way that they thought, no difference in what books they read, no difference in their general level of intellectual achievement, no difference in their goals and aspirations (perhaps one strongly desires to learn technical things without having a degree, and perhaps one does not...).
Well, without any of those other differences, if one has a degree and the other doesn't, then yes, I'd choose the one that has the degree over the one that doesn't.
But that's assuming that I'm a standard employer... and that I don't know the first thing about CS myself...
If I'm a smart employer, I might test both individuals' ability to cognitively reason about problems.
For example, I might have both candidates add the numbers from 1 to 100, and see what they do.
This was a challenge that was historically put forth to Carl Friedrich Gauss when he was a student (I should point out, he didn't know the first thing about computers or programming, as they didn't have computers, programming, or CS degrees back then).
All of the other children attempted to add the numbers from 1 to 100 one at a time, for example, 1+2 (3), 3+3 (6), 6+4 (10), etc.
This took them a very long time.
You see, the teacher had expected that this would take a long time for most students, that it would keep them occupied. That was the teacher's goal.
The teacher was very surprised when after a few minutes when Carl Friedrich Gauss' hand shot up.
He had solved it!
He had solved it not by adding all of the numbers one at a time, but solved it by realizing that if you added the first term and the last term (1+100, 2+99, etc.), it resulted in 101 every time, now all you needed to do was multiply 101 by half of 100, which is 50.
Which is much, much faster!
We call that an algorithm.
A CS degree is < 10% code, and > 90% algorithms.
You see, the teacher could have used that simple test to see that Carl Friedrich Gauss -- was going to go places in life.
He was going to go to great places, and do great things... and he did!
Even without a CS degree... which they didn't have back then...
If I gave this test, or others like it, other tests involving mathematical / logical reasoning to people with CS degrees and without, and if the people without a CS degree answered these questions correctly, reasoned correctly, it would show that they have the talent, they have the capacity for computer science, with a CS degree -- or without...
"Would you agree to undergo surgery by a self taught physician or you would trust more one with formal education?"
It will always be the person that persuades me that their knowledge/experience relative to the goal I'm seeking is the highest among all candidates. If that's someone university educated, then that's someone university educated. But show me a faster/better way to do things, and prove to me that you're knowledgeable and it works, and I'm all in...
In that sense I feel like learning CS is getting a huge IQ boost into everything that is related to CS.
But I'm still relatively new to software engineering. So far, picking up about SOLID, design patterns, testing patterns, and what not feels a lot easier than writing a compiler or writing an operating system or performing attacks like Meltdown/Spectre/<insert any research from VUSec>.
Don't get me wrong: I should still respect it and work hard, but when I wrote a compiler I didn't even believe I was smart enough to build one from start to finish. I've had this multiple times over my CS student career. Now that I graduated, I still can feel like that but I have experienced it so many times, I simply know it's false. Now I know that I just need to put in hard work, and I'll be guaranteed to understand it.
Are there more optimal ways to learn software engineering? Yes. However, the value of CS in relation to software engineering stands: learning software engineering is now easier. Moreover, universities usually don't teach more optimal ways and we're stuck with the toxic narrative that university sets us up for life.
I did that. But I also started many new software projects. And CS education helped.
If you don't want to get stuck in maintaining old crap, you don't have to. You can change jobs. You can change type of projects you work on. I did.
I did game programming for lots of years and grew bored and tired of it and now I am doing web apps which I enjoy doing for the time being.
The book is here: https://classic.csunplugged.org/wp-content/uploads/2015/03/C...
- A quote (mis)attributed to E.W.Dijkstra.
Sounds like what I've heard of CS education in a lot of developing countries. When students can't commonly afford computers, computer science courses turn to pen and paper.
FWIW, I graduated college in 2016 in the US, and probably around 1/3 of my computer science homework (as well as 100% of the exams) were pencil on paper (or in the case of some homework, typed in either something like Latex or a word processor, but still not writing code).
I wasn't originally planning on becoming a software developer as a career, I started studying Mechanical Engineering. However, I failed first year (due to undiagnosed ADHD and a lack of interest). Luckily Tim was a lecturer at my university (University of Canterbury), and let me jump straight into second year computer science.
He was definitely one of the best lecturers I had, alongside Richard Lobb. It's not often that you meet an academic who's more interested in teaching than research, but they were, and it showed.
Thanks Tim.
> The studentren are actively involved in communication, problem solving, creativity, and thinking skills in a meaningful context.
It seems as if they wrote "children" and then replaced s/child/student/g in some sections :)
And at the risk of explaining a joke that applies to both the weight and the applicability of the results to ALL computers.
I went to high school in '90s and was assign in an intensive CS class. At the beginning, most of learning were done using pen and paper, writing pseudocode and also Pascal and C. Me and most of my peers were poor enough to not have a computer home, and the school only had ZX Spectrum clones running Basic. However, the school got some used 386 and 486 next years, so we got to use "the real deal". In my last year, my parents also got enough money to buy me an used 486 SLC - which got intense use since I also had Borland C++ compiler and a C++ for dummies book. I did my final project for CS in Borland C++ on that PC. It was a DOS based MS Paint clone.
Before that, I owned a ZX Spectrum clone when I was in secondary school, and while I did some programming, most of it was written on paper first and typed on Spectrum later. I compiled and debugged "in the brain" because I couldn't save programs and if a program halted, I had to reboot the thing wasting all I have written. A guy my father knew hacked a cassette player to help me load programs and games, but sadly it didn't work to save anything.
Even now, I sometimes like to draw diagrams, sketch code flow and write bits of pseudocode on paper before I start coding something, if I feel I need to clarify the idea.
It’s fun bringing the computers in to play as well, because I pitch to all my classes that we are in the age of information and the primary usefulness of algorithms is productivity.
A whimsical classroom example: programming a robot that can type for you, with an instruction set that consists of capital letters. Q returns to that key. LRDU are left a key, right, down, and up a key, and P means “press the key you are over”.
Step one: create robot code to type HELLO. Answer: QRRRRRDPLLLUPRRRRRRDPPUP.
Step two: create code to turn a robot code into a string: similate the robot essentially.
...which is about it for the coding, but then we make a robot print instructions for a second robot to print instructions for a third robot to print HELLO. We end up with something super weird looking but tractable because all the components were built from the ground up.
Computation is that wonderful meeting place between theory and leverage — the kind of leverage you get when you can do “2+2=4” 3 billion times a second.
2018: https://news.ycombinator.com/item?id=17661707
2015: https://news.ycombinator.com/item?id=10171469
2008 (not very good, and look at that typo): https://news.ycombinator.com/item?id=158948
Not this program specifically, but in high school I was taught Pascal without touching the computer for the first couple of months. All of our programs had to be written by hand. And included traces of the code ... all the values of the variables throughout the lifetime of the program. I was disappointed at the time, but looking back, it was a great way to write code. It was more about the meaning of the code, not fighting compiler errors.
Edit: this would have been 1993, when I was in 9th grade.
That's exactly how I felt and feel about a similar experience I had learning Scheme
One suggestion I might have is, depending on their age, doing combinatorial game theory with them. That sounds really hard and fancy, but it's not (at least at the introductory level). There's a lot of games that are really simple to describe (e.g. counting games, simple board games) and your goal is to figure out the smartest move and / or if the player who starts the game can win.
This is good stuff, and very well-regarded by my colleagues.
Depending on the age of your kids, https://automatetheboringstuff.com/ or another of Al's books are quite good to start with and free to read.
For younger kids, Code.org's "Hour of Code" stuff uses Scratch, which is a nice block-based visual programming language that's still a real enough language under the hood; I had co-workers who used Scratch to have their AP CS students sorting lists of numbers and other "real" algorithmic tasks.
And I'd be remiss if I didn't mention the book I wrote, which is linked in my bio.
The at home resources are here: https://csunplugged.org/en/at-home/
My daughter's 10th grade programming teacher (<3 you, Mister Serota) had a pretty brilliant mechanic for teaching functions to kids in his class that he relayed to me, and which I will attempt to relay to you.
Effectively, he simply assigned some of the children in class to be 'a function.' Whatever input he gave them, they would have a predetermined routine to execute and give him output. E.g., "Billy, your function adds 2 to whatever input is given. Barbara, your function is to divide everything by 2. Samantha, your function is to determine whether or not dividing something by 2 will leave a remainder (modulo)."
Then he would work complex computations through the room with scripts he'd devised, showing the power of chaining functions together. Similarly, if you give Billy the "+2" function, and then give him an input value of "A", well, he might come back with "C" as the output, or he might come back with puzzlement, and you can teach error handling. Similarly, you can assign multiple kids the same functions (and show asynchrony, or hand them different bad values to show the possibility of inconsistent code).
TLDR: You "program" the children to be functions, feed them data, and then play around with how to best illustrate the concepts by manipulating the inputs and how you string them together.
They weren't stupid people, I had CS classes with many of them and they were brilliant. They just didn't care one bit about using computers. They were 100% into theory.
[They also wanted to name a building after him (The Hoare-house) but for an unknown reason changed opinion. ;) But that's another story]
For most LOB apps the only thing that matters is using framework X, applying some flavor of the day principles like SOLID and DDD, using some software patterns, gluing different libraries with some code, copy-pasting from Stack Overflow and writing tests. A productive, well oiled machine which churns out software.
i wonder if cs unplugged is better than godot gaming for teaching 8-10 year olds how to think and code.
The "text editor" for Machine Language (the original "ML") was an engineering pad.
All of my basic CS courses we're on a whiteboard