Hacker News new | past | comments | ask | show | jobs | submit login
How I'd teach computer science (scripting.com)
30 points by ingve on Oct 17, 2016 | hide | past | favorite | 69 comments



"Computer science is no more about computers than astronomy is about telescopes." (Edser Dijkstra)

Computer science is the study of algorithms - what is described here may be best described as software engineering. As an educator who has been involved in computer science education for almost a decade, I find the code-centric approach described here to be counterproductive.


My favorite quote around this is from SICP's preface:

Underlying our approach to this subject is our conviction that 'computer science' is not a science and that its significance has little to do with computers. The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology -- the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects. Mathematics provides a framework for dealing precisely with notions of 'what is.' Computation provides a framework for dealing precisely with notions of 'how to.'


And the quote that made me interested in CS, from the online lectures of the same book:

"[As] opposed to other kinds of engineering, where the constraints on what you can build are the constraints of physical systems ... the constraints imposed in building large software systems are the limitations of our own minds."


This poignant passage really stuck with me when I first picked up SICP in college. Thank you for reminding me of it!

Time to peruse my bookshelf for other inspiring quotes.


I'm not sure I'd be able to find a job if I told people I have a degree in procedural epistemology.


Algorithms are one big part of computer science, of course. But there's more than that. Computer science is also about abstraction: how to organize our programs so that they can be understood (not just tested!) with the minimum amount of intellectual effort possible. Dijkstra himself wrote a lot about this topic:

https://www.cs.utexas.edu/users/EWD/transcriptions/EWD02xx/E...

https://www.cs.utexas.edu/users/EWD/transcriptions/EWD03xx/E...

https://www.cs.utexas.edu/users/EWD/transcriptions/EWD03xx/E...


I absolutely agree with your point that abstraction is a fundamental idea of computer science, but I believe it still falls more in the conceptual realm of computer science than in the practical realm of software engineering. For example, if I were to describe abstraction to a student, I may first get them to imagine building a factory assembly line. Instead of thinking about the assembly line as a whole, I would encourage them to think about each stage of the assembly line, and how to test each individual machine separately. By abstracting each step of the solution and making it easy to verify its correctness, they can achieve the minimum intellectual effort in testing the entire solution as you described.

Thank you for taking the time to add the EWD links, I'm sure others reading this thread will find them as enlightening as I do.


It's not counter-productive at all, as long as your goal is to teach Software Engineering. And every course of study in Computer Science should have at least a semester's worth of content on Software Engineering.

But it's also important to remember that Software Engineering is not Computer Science.

Also, a 4-year-long course of study in Software Engineering should definitely cover things aside from coding. Some Computer Science for sure, but also the basics of business, ethics, economics, politics, psychology, and so on.


How much do you have to know about using telescopes to become an astronomer?

I don't know the answer to that question, but I recall that my introductory physics courses and labs focused a fair deal on the practical part of understanding how things worked in the world, not just talking about theory 100% of the time.

(Though I don't know how either "computer science as pure science" or "software engineering as pure engineering" would actually work in the first place, though.)


I can't think of any instances where a computer science educator or course talks about theory 100% of the time. IMHO, a course that is pure theory can be quite boring.

The key is to differentiate the role of the computer from the role of the scientist. A computer is just an efficient tool for making discoveries in computer science, but it hardly represents what computer science is all about. Similarly, a telescope is a tool for discovering the realities of the universe, just like a microscope is a tool for biological discoveries. Certainly we need physicists to deal with the practical problems that affect our day-to-day lives, but the most high-profile work in physics aims to explore the unknown. In physics this is the nature of the universe - in computer science, it is the nature of computation and its limitations.


that should be "Edsger Dijkstra"


This doesn't sound like a Computer Science course. Maybe for something like a Software Engineering degree, but not for CS.


Agreed. The post is so devoid of any context about where this would fit in a program that it's hard to tell what the author was attempting to convey.

It's absolutely inappropriate as a starting point for either CS or SE.


Agreed. This raises even more questions: Do we need more computer scientists or software engineers? Why do so many universities offer computer science programs, if the job market is primarily asking for software engineers? Even worse, why do so many universities offer software engineering programs that call themselves “computer science” programs? Isn't that lying to students?


The job market seems to favor Computers Science degrees over Software Engineering degrees.

Although it favors job experience over both.


Why? Because of the word “scientist” in the degree's name? What exactly is the point to employing a scientist to perform non-scientific tasks?


My guess would be that a CS program would cover more fundamentals on which you can always build upon, but a Sw Engineering program might not focus on the basics as much. Of course there might be exceptions in either programs.


In a lot of schools, a CS degree can be a barrier. Many people change majors or wash out due to the rigor of a CS degree.


I think its because the job market favors CS degrees, so the best students go for the CS degree


I think because CS degrees tend to produce more competent programmers, for some reason.


Because CS endows a more fundamental understanding than SE. SE classes are often along the lines of "Here's how you do OOP in Java", whereas CS classes are more along the lines of "Here's how you formalize OO semantics and then implement the semantics at a low level." The latter approach is generally more effective, if more difficult.


Sometimes I'm not even sure if “software engineering” can be said to exist as a discipline. In every other branch of engineering (mechanical, chemical, etc.), practitioners actually understand the scientific foundations of their profession, even if they aren't research scientists themselves.


I would actually like to see a study on that. I'm not so sure its true, and it certainly has not been my experience. I do wonder if anyone is ever going to do a full study on the subject.

Weirdly, some of the best programmers I have met are people who go their degree in Music Theory. Odd and really not enough sample size.


> Weirdly, some of the best programmers I have met are people who go their degree in Music Theory. Odd and really not enough sample size.

This is a very common experience, and I think it's a form of selection bias. If you look around at the top people in the industry, most have studied CS or closely related, highly mathematical subjects (math, physics). But the reason why so many people see "great" programmers who have studied art, music, literature or any other field is, according to my hypothesis (which may well be wrong), because they don't work in an environment where the typical bright CS student goes to work. So if you're working in a small web-dev company, you're not getting the cream of the crop from MIT, Stanford, CMU and other top universities (or even the less well known ones) -- those guys (or gals) go to work for Google, Facebook, hot startups in the valley or stay in academia. Instead, you're getting the average or below average CS students, and the brightest people who studied irrelevant subjects, who would have a hard time getting into a company like Facebook.

Again, I may be wrong, we need a much more in-depth analysis to draw any form of conclusion. Still, I think this also highly depends on what you consider a "great programmer". Many people consider a programmer to be great if he writes very clean, logical and easy to understand code. Personally, I think this is way too low of a bar, and I think being called great requires a very in-depth understanding of a subfield of programming (be it graphics -- Abrash, scalability -- Dean, languages -- Stroustroup, Sutter, Alexandrescu etc.) Maybe not as good or well known a the people I mentioned, but I wouldn't call any random programmer from a random company writing CRUD apps great.


Even reading your comment charitably, I am left with the thought that you consider me some country bumpkin that hasn't been exposed to high quality programmers.

I'll point out the previous conversations about selection bias of universities and the companies who hire their students. I'll also point out that people go to different places because a variety of factors, many of which are beyond our control. Few actually get to walk the straight path, and I find people who don't recognize the luck they have received are poorer in spirit for it. I think you suffer more from selection bias and a need to uplift your position than I.

"I wouldn't call any random programmer from a random company writing CRUD apps great." - I suppose someone could say the same about those who serves up ads or writes webmail clients. I believe the world is amazingly interesting with the unique problems we face as programmers and challenges lie in the heart of many pieces of software. We are much too young a profession to think that the world is routine.

"Many people consider a programmer to be great if he writes very clean, logical and easy to understand code."

I would also say the best sprinters are fast. I guess I have a reverence for those who write in a clean, logical, easy fashion. I like elegance in all things and find it a very high complement. How else would one show in-depth understanding? The code is the expression of programming, not the spoken word or lecture. I guess I'm a simple man, and believe in people showing me.


What metrics do you use to evaluate 'best programmers?'


For myself, I look at people who produce code that meets the specification in as brief, logical, secure manner as possible without causing a maintenance burden for their fellow programmers or the support staff.


Are SE degrees common the US? I've only seen a couple of colleges that offer them and they weren't very good colleges or quite obscure. If the top 50~ universities offered a SE degree that included say, half of a CS degree with the other half being project/internship/"real world" stuff, would the job market still prefer CS?


It seems to me that most job adverts require a technical degree or relevant experience. I feel that very few jobs would make a distinction between a SE or CS degree.


That's what you do in courses like "Introduction to Software Engineering" (first/second lecture), which usually are part of the first BSc CS semester.

I don't disagree though that the title is misleading and the content quite disappointing and it wouldn't make a semester-long course because that list is covered in 10 minutes and it's nowhere near academia.


I knew what to expect from the title. An actual computer scientist wouldn't be clueless enough to suggest (s)he can teach everything about computer science. Instead he would probably say how (s)he would teach something in his(er) narrow field of specialization - algorithms, databases, operating systems, compilers, whatever.


It's not even software engineering, it's just basic troubleshooting skills. You could teach automotive repair or plumbing the same way, probably. I'd like to see a course taught in that that doesn't necessarily focus on computers, because those skills are tremendously applicable in pretty much every field.


Spoken like someone who hasn't taught a CS class.

You really want to teach some useful skills and not actually disrupt your CS class too much? Here's the start.

Lecture 1: How to drive a basic IDE (I used to choose Eclipse, but I might rethink that nowadays depending on language used. One of the IntelliJ projects might be easier.).

Most students are stunned at the difference between what they use as an editor vs what an IDE can do. Once somebody shows them what is possible, they start swimming really well.

Lecture 2: Source control and automated testing.

For most students, they view this as a homework dropbox that checks and runs their work. That's good enough to start. Some of them progress beyond this.

NOW, I can actually start to talk about the substance of my class as well as how to put that in programs.

Guess what? I have to give these lectures to every single class I teach. It doesn't matter if the class is 101 or 499, every single class.


I've been pushing the head of the class I help TA for to make it mandatory that students use PyCharm. He's still afraid that PyCharm will intimidate the users but I think it's well worth it.

We have 2nd and 3rd year students at my college who still haven't opened Eclipse, IntellJ/PyCharm/Whaterver else, or even Visual Studios. They have also never used a debugger. They have no idea what formatting standards, or naming standards are. It's crazy.


> I've been pushing the head of the class I help TA for to make it mandatory that students use PyCharm. He's still afraid that PyCharm will intimidate the users but I think it's well worth it.

Dropping an IDE and automated testing into your class is not without cost.

10% of the questions the rest of the semester will be how to do something in the IDE. And, occasionally, you're not going to know the answer. Saying "I don't know" can be intimidating to someone who doesn't have 20+ years of experience.

As for source control and automated testing--congratulations, you are now Mr. IT-guy for 30 people for the next 14 weeks. And students can be really creative in wedging their repositories. To this day, I still have no idea how one student managed to create a recursive repository in Subversion.

You really have to be committed to accept the cost of the things I recommended.


> 10% of the questions the rest of the semester will be how to do something in the IDE. And, occasionally, you're not going to know the answer.

Most of the things they will need to do will be laid out for them before hand. I also have nothing against them asking me more questions. I'm technically paid by the question and it's better for them to ask these questions in an environment that is as conducive to learning as a classroom instead of needing to ask a boss/coworker on the first day of class.

> Saying "I don't know" can be intimidating to someone who doesn't have 20+ years of experience.

Sometimes the answer to other things is "I don't know" but, every time I didn't know something and I have to help a student I always follow it up with "but let's dick around with this a bit and I'm sure we can get it working"

> As for source control and automated testing--congratulations, you are now Mr. IT-guy for 30 people for the next 14 weeks. And students can be really creative in wedging their repositories. To this day, I still have no idea how one student managed to create a recursive repository in Subversion. You really have to be committed to accept the cost of the things I recommended.

If a student is paying 15-30k a year and I'm making 8.50$/hr to help them I have absolutely no problem helping them. They are quite literally paying my salary. I've answered emails at 2am before an exam, met up with students on weekends before exams, and spent hours with students to help them "get it".

School should be about getting taught the material you need to succeed. It should be our goal to achieve that even if it's a little hard.

And again, I don't think that student is going to be making a recursive svn directory in front of their boss after you helped them out of that ditch and it's a good thing you did.


Agree with all of your points. I'm simply pointing out that all of these things take time away from my primary mission which is to teach my material.

I need to teach the material as it generally is a building block for what comes later. If I don't get the material across, I've done a bad job as well. If I teach Data Structures, the students need to know that when they come out of my class or they will fail the next classes. (I had to reteach Data Structures to a class that had a bad teacher once before I could teach my material).

And, I applaud your dedication as a TA. People have zero idea how much effort goes into actually teaching a class. As the instructor, teaching a 14-week, 2 2 hour lectures per week class is a greater than 40 hour/week job including planning, constructing projects, running the infrastructure, answering questions, office hours, and grading exams.

That is, sadly, why I don't teach much anymore. I would earn more hourly by working at McDonalds than I do if I lecture at a university. :(


Heh, way more than 10% of my CS classes' questions were how to do stuff in Emacs (what my professor said we should use). I used to just use Sublime and `scp` the files back to the school server.


That's unsurprising. I would never use vi or emacs for beginners.

However, I also didn't care what my students used. I taught Eclipse. One of my students said: "Is using Netbeans okay?" "Okay? That fact that you have a conception about IDE's makes me ecstatic. Absolutely, you can feel free to use whatever you choose. Just know that I can't answer questions about your IDE, so you are on your own for that."

For my very senior class, I set things up so that they could actually use any of the JVM languages rather than just straight Java (Using Groovy, Jython, JRuby, etc. would have made their programs SOOOOOOO much smaller and easier). Disappointingly, nobody took advantage of it.


> Using Groovy, Jython, JRuby, etc

Hope you included Scala, Clojure, and Kotlin in that list, all of which are more suitable than any of those three.

Jython's been around since 1997-ish but isn't used much, nor is JRuby. As for Groovy, I recently looked into its apparent popularity at #17 on the TIOBE ranking and found Baidu was giving a result 12 times too high and Yahoo a result 20 times too high, both of which would skew the ranking. Groovy's real ranking is somewhere below that of #50 ranked Clojure.


I would have taken ANY JVM language at the time. ANy language with hash tables and tuples that wasn't so verbose would have been a vast improvement.

Groovy gets a boost because of Gradle which is now the default build system for Android Studio. That's going to artificially inflate its position.


Usually, students don't really need IDEs or source control in order to learn the basics. They write short programs that require more thinking than typing/editing.

It's only for bigger projects that they start to be useful, and when students reach that stage, they don't have any problem to use them. Actually, IDEs can be problematic for beginners as they may hide things you'd like the students to learn (e.g. compiling from the command line).


> Usually, students don't really need IDEs or source control in order to learn the basics. They write short programs that require more thinking than typing/editing.

Only at the very beginning where answers are less than 10 lines.

After that, it's surprisingly useful.

> It's only for bigger projects that they start to be useful, and when students reach that stage, they don't have any problem to use them.

Oh, your naivety is touching. In my senior level class, I expected that the program would end up being about 2000 lines of code by the end. I still needed to give the IDE lecture as people were struggling with editing (foolishly, I didn't give it immediately because I thought like you did).

> Actually, IDEs can be problematic for beginners as they may hide things you'd like the students to learn (e.g. compiling from the command line).

So wrong. The command line is the LAST place I want a beginner. I don't even want most intermediate students at the command line. The "UNIX lectures" were one of the most hated things in the CS department.

In fact, quite a few of the students never compiled anything themselves. They submitted it to my automated tester via source control which would compile and test it immediately.

Would I have liked them to compile and test themselves? Absolutely. However, I'm not there to teach infrastructure so I'll take whatever works and lets me get on with teaching the actual information from class.


I often hear many many people say "what you want is Software Engineering not Computer Science" and I'd say YES that's EXACTLY what I want. The problem is finding a university that will give it to you.

In my opinion the field of Computer Science should be the study of abstractions, logic, derivation of algorithms, understanding the limits and possibilities of computer hardware, and programming (being the development of a real-world solution to a problem that can be run to process data). If it's not one of those items I don't think it belongs in Computer Science. Sadly, our field has been managed, since the beginning, by professors who think it's math field.

That's the way I'd say most hiring managers look at it: Computer Science = Programmer. The only place this isn't paralleled is academia.

So I'm perfectly fine with saying either everyone else is wrong and my definition is correct, in which case we need to seriously evaluate how Computer Science is taught in schools. Alternatively I'm wrong, in which case I'd love to attend a university that will allow me to get a bachelor's, master's, and maybe even a PhD in Software Engineering because the truth is I hate whatever it is that academia considers Computer Science but I love logic, creating solutions to problems, thinking about the limits of hardware, optimizations, and everything that goes along with it.

Sadly I cannot find any university that offers this. My university offers a SE masters degree but it requires a BS in Computer Science! How ironic!

But yea, I'm perfectly happy with either of those outcomes. The people who are, in my opinion wrong about what "Computer Science" is can stay in their corner and I'll stay in mine.


> The problem is finding a university that will give it to you.

Go find one of the multi-week intensive programming "camps" with a good reputation (do be careful--there's a lot of snake oil out there). That's what you want.


The problem is that bootcamps are 3 months of "intense" and pressured learning the most marketable language at the time and as far as I know aren't accredited like regular universities.

What I'd like to see exist is a 1~ year program at a real college (can be community college!) that is basically a more comprehensive and relaxed[1] version of a bootcamp.

[1] I don't mean this to sound "easy", just not 8-10~ a day of work like bootcamps are.


I'll go a step further. Right now I've created The Perfect Semester for myself.

Right now I am taking:

   - CS280: C++/Interpretations & Composition of Programming Languages 
   - CS288: C/Whatever random crap the professor came up with
   - CS252: ARM EABI Assembly/Computer Architecture 
   - CS332: Operating Systems
   - IS350: An Ethics Course
I'd love a college that will let me do something like this. Create a schedule for 4 years (like a normal degree) that will provide me with, you guessed it, a degree in "Software Engineering" where I learn about, you guessed it, Software.

I want to learn every popular language's ins and outs. This includes, but is not limited to C, C++, Ada, Lisp, Java, C#, Python, x86/x64/arm/MIPS assembly. I'd like to be taught, not lectured to, I want to actually learn from my professors. I want to learn about software abstraction, organization, revision, and project management. I'd like to be able to learn about ever piece of software running on a system and be taught how to implement them. I'd like to learn how to use every single tool in my arsenal to solve any problem in development or in my problem domain.

I want to actually build things with seasoned experts (my professors). I'd like to come out the kind of person, who when asked to solve any computer-related problem doesn't stutter but just hops right on it.

I've done, to the best of my own ability, just that outside of school yet there are just some things I cannot teach myself.

I love computers and I want the curriculum to mirror that.

And for anyone who want's to say "oh you just want the easy way out, you just don't want to take English/Math classes because that's too hard". I've heard this many many times before. I don't want anything easy. If anything this curriculum that I want would be far harder than any CS curriculum ever before it. But it wouldn't be hard for me. Not because I know how to do all of the stuff in it, but because I love doing all of the stuff in it. These things are what I excel at doing and I strive to know as close to everything about these things as I can.

Sadly, we don't really get a say in this sort of thing. My beard isn't nearly gray enough and I don't have a white coat, so in the end my opinion is unimportant.


> I want to learn every popular language's ins and outs. This includes, but is not limited to C, C++, Ada, Lisp, Java, C#, Python, x86/x64/arm/MIPS assembly. I'd like to be taught, not lectured to, I want to actually learn from my professors. I want to learn about software abstraction, organization, revision, and project management. I'd like to be able to learn about ever piece of software running on a system and be taught how to implement them. I'd like to learn how to use every single tool in my arsenal to solve any problem in development or in my problem domain.

And yet the CS curriculum is exactly what you need in terms of foundation so you can learn all of that.

What you are asking for is a (probably several) lifetime of information in 4 years. Wouldn't we all like this?

> I'd like to be able to learn about ever piece of software running on a system and be taught how to implement them.

Take the track that leads to your "Compilers" class. You will get most of the pieces you are asking for along the way.

> I want to actually build things with seasoned experts (my professors).

Sorry, but your seasoned experts are probably in industry, not academia.

> Sadly, we don't really get a say in this sort of thing. My beard isn't nearly gray enough and I don't have a white coat, so in the end my opinion is unimportant.

Sure you get a say, but those of us with experience also realize the sheer enormity of what you asked.

And we greybeards don't even know ALL of that.


I'm sorry but I can't see any more then 10% of the curriculum of the standard CS class is required to learn about software engineering.

This is more so true given that my school requires:

   - 7 Humanities classes
   - 5 Math classes 
   - 3 "Interdisciplinary Studies" courses which are any science that isn't CS
   - 3 Social Science classes 
   - 2 "General Electives" which are any class that isn't CS-related 
   - 2 PE classes 
   - 2 Physics classes (With labs)
   - 1 "Science Electives" class (Most with lab) 
The Science Electives and Interdisciplinary Studies are basically just CHEM, PHYS, MATH, or BIO. Nothing in CS is offered.

How many CS classes do I take, you may wonder?

Only 16.

Now I ain't no mathematician, despite my college wanting me to be, but that don't smell a no good. With some fancy adding I come up with 25 non-CS classes and 16 CS classes. Pile on some fancy division and we get to an amazing figure.

Only 40% of my degree is CS. This was counting everything in the "CS" course label but many of those courses aren't technical.

Counting only "real" cs courses (where you learn theory or implementation of computer science topics) there are only 12 CS courses. The rest are non-CS classes under the same name. Things like 1 class about how the university works, 2 classes about teamwork (which is also done in the management GUR I need to take), and 1 class in Discrete Math..... notice the "Math" suffix.

That brings us down to a whopping 30%. Only 30% of the money I am paying for college is going towards something I want it to (in the case where all of my money is spent on academia rather then sports) and it is also assuming that all of my classes are actually teaching me something. Most classes are just professors coming in, telling us stuff that is blatantly incorrect (I keep a list now to pull out when this point I'm bringing up comes into an argument) and then they can't even implement the assignments they are giving us.

A more realistic number is that ~50% of my CS classes actually teach me something I've never learned before.

So we are down to a sad, sad number of 15%. A measly 15% of my time is actually spent learning about computer science.

Now, let me ask you. Would you think that the 15% of my time in Computer Science will actually teach me as much as 4 whole years of computer science?

You cannot ever convince me that someone wouldn't come out of a course like that knowing less then one of the 15%-educated students.

So I guess it's turned out that I was wrong. It's not 10% of my education it's 15%.

> And yet the CS curriculum is exactly what you need in terms of foundation so you can learn all of that. > What you are asking for is a (probably several) lifetime of information in 4 years. Wouldn't we all like this?

I'd say that my fellow students would be better served with 4 years out of that lifetime of CS knowledge checked off rather then learning to find the area under the curve.

> Take the track that leads to your "Compilers" class. You will get most of the pieces you are asking for along the way.

The only track thaparserst leads to a "Compilers" class in my school is a Masters. The class on compilers that actually touches on things I haven't experimented with in my own time (LLVM, writing parser, writing interpreters, reading through some books here and there) are classes that lay in the 600 level.

> Sure you get a say, but those of us with experience also realize the sheer enormity of what you asked

You don't think that I have enough experience to understand that this is a massive undertaking? I do. Ask for everything but settle for half because every victory, no matter how small, is still a victory.

Now there are exceptions. Are you going to work in finance? You probably need to know a bit of calculus. Are you like me and want to go into R&D? You are definitely going to need to know a lot about signal processing and some machine learning is always helpful. Are you interested in contract software development again like I am? Then you will need a little bit of background on software ownership, copyright law, and general contract negotiation.

The only common thread through these fields is a heavy reliance on your ability to program. Everything else can be bolted onto your degree.

But I don't think it's wrong to say that someone needs to take 21hr of English classes, 20hr of Math classes, or 6hr of Physics classes, to be a Computer Scientist.

Edit: List ordering


> Are you like me and want to go into R&D?

An intro in each of the basic sciences is indispensable for a career in R&D.

Taking only 5 math courses (3 calc + discrete + linear?) is likely woefully inadequate, unless they're all taught very well or you plan to teach yourself a bunch more math. In fact, you should take abstract algebra, probability, and as many analysis courses as you can while you have the time. In either case not sure what you're complaining about.

The humanities courses are a good place to practice your writing and argumentation; those skills are transferable to negotiation of every sort.

Also, you could've knocked a bunch of those required courses with AP/IB credits in high school (2 history courses, 1 or 2 english, intro bio/chem/phys (3), intro CS (1), calc (1-2) = 7-10 courses).


> An intro in each of the basic sciences is indispensable for a career in R&D.

That's why I've been pitching in time and helping Drs at my university with their research in fields like RF and Physics. I learn much more then anything I've gotten out of a classroom.

> Taking only 5 math courses (3 calc + discrete + linear?) is likely woefully inadequate, unless they're all taught very well or you plan to teach yourself a bunch more math

When I'm taking on a problem that needs to be solved I immerse myself with information about the problem domain.

Linear algebra is the only thing that you've talked about at all that I've found useful so far. I did a bit of game development in my own time in high school and ended up teaching myself a lot about it. Mainly I just dicked around with implementing parts of a physics engine and taught myself a lot. So yes, the reason I want to go into R&D is because I like to learn about many different things but only if there is a reason.

But still, I don't want to be the only person in a team in R&D. I want to write firmware, software, and work on implementing designs. I've also proven to be fairly "ok" so far at management. I've got a lot to learn but it is something I can do, so I might bark up that tree.

> The humanities courses are a good place to practice your writing and argumentation; those skills are transferable to negotiation of every sort.

I do more writing and argumentation in my own time. I spend about 10 to 15 minutes

> Also, you could've knocked a bunch of those required courses with AP/IB credits in high school (2 history courses, 1 or 2 english, intro bio/chem/phys (3), intro CS (1), calc (1-2) = 7-10 courses).

If these are things that could have been "knocked" out in high school then they definitely shouldn't be part of a high school curriculum. I had a lot of family problems in high school and that lead to a large problem with my "behavior" in school. Mainly not wanting to take shit from my teachers after hearing everything all night from my parents. Here are some antidotes from my high school "experience" (which I also consider to be mostly useless and feel a majority of the time I spent there could have been better spent someplace I could have actually learned something rather then just sit and stair at a wall all day)

   - My math teacher told me that any problems that I didn't show work on would result in a 0. This was after the game-dev time in my life and the class was only algebra 2. Everything was easy and I didn't show any work. I just took the zeros on the homeworks/exams until I was called into the guidance office  to "explain' myself. I said for them to give harder problems or for them to leave me alone. 
   - My math teacher didn't like me using pen on the exam. She said I'd loose 5 points every time if I did. I just kept doing it. I think my highest grade from that marking period was a 95.
   - I gained access to the schools camera/DVR system and used it to find my friends between class. Principle threatens to call the cops and I just gave them all the info I had and told them I was sorry.  
   - I didn't do any of the homework or classwork for my English class one semester, scored AP on all the standardized exams and 80+ on all the class work. They put me into a remedial class for English where I put in the same amount of effort but ended up getting an A.
   - I managed to get a D in gym class some how. I don't even remember how that happened.
   - Pre-Calc my senior year I again didn't do anything except now we where allowed TI NSpire's so I ended up installing Pokemon on my calculator. I played that.
   - My last two years I was able to take programming classes, I helped the teachers clean up their material since they where teaching from books. Nothing good ever comes from that. 
I've probably got more stuff I'm not remembering but you might be seeing a common trend. High school is basically just a place to get you used to working in a factory and making sure you wont drool on yourself in public. It was a huge waste of time that basically kept me away from learning about the stuff I wanted to: computers

Anything that carries over from that shit show into academia is again a huge hint that you've got a large problem. I also don't think my time should be wasted learning things I don't need nor do I want to pay for it.

I'd understand if most people actually remembered the materials taught in these classes. That's one thing. But that is seldom the case.

There are very limited things that college has been good for:

   - I've got a lot of debt which makes me now applicable to some government loans/small business programs.
   - I've met 1 or 2 professors who are actually good at what they do AND want to share their secret sauce
   - I have access to a library with academic subscriptions (although the library won't subscribe to JOM... bastards. I pay them 15k/year they can spend a bit of that on important reading material) 
   - I can help people build things that I like
Without these I'd just drop out. I'm 100% sure this isn't worth what I'm paying but I'm in so much debt now that the FAFSA will finally help me a bit so I might as well just hate my life a little longer, struggle through the BS, and at least get a piece of paper that other people will think is impressive.


That's a lot of general education (7 humanities, 3 social science, 2 general electives, and 2 PE classes--42+ credit hours). Far more than I would expect for a BS degree.

However, 5 math classes are probably minimum. Calc I, II, III(Vector), Linear, and Discrete give you just barely enough. Want to build a game engine? Yeah, you will need every ounce of that math and then some--you're actually missing at least a numerical analysis class that you will need.

6 courses of science (18+ credit hours) with some labs is hardly too many. Most people use computers as a tool to support other fields. And lab technique dovetails with debugging (see some of my other comments). Understanding physics sure helps when you are doing signal processing.

HOWEVER, the biggest issue is that you probably don't belong in a purely CS track (which is generally in something like College of Arts and Sciences). You probably belong in an EECS program.


Please see https://news.ycombinator.com/item?id=12731507

Again, this is NOT CS this is stuff that can be bolted on (just like I am doing). It's a net waste of time for everyone to make these things mandatory. I'd say that from the math and science classes here I've taken I remember nothing. From the things I've needed, banged my head against the wall for hours to learn and implement, and then used for a real project I still remember. This is about 3-4 years after learning the material on my own as opposed to learning the other material last semester.

The only thing that's useful is something that you actually remember and use. That's one of the hugest reasons why most of these math courses are useless garbage. I just see it as a way to suck money out of students.


> That's what you want

No it's not. I'd like a degree, I'd like to learn from professors how to research in this field, I'd like to publish papers, and eventually after some years in the field I want to retire and become a full time lecturer/researcher.

A code-camp cannot offer me that, only a university.


Writing bug reports took me 5 minutes to figure out how to do in the real world (or maybe an hour, or even a day, but not too long). This is not something you need to take a class to figure out.


I don't think writing bug reports is as simple as it seems. Sometimes it actually takes time (and experience) to learn how to communicate an issue them properly. Writing steps to reproduce, which systems, etc


"A minute to learn, a lifetime to master."

Seriously though, do you feel you missed out because your CS degree didn't teach you how to write bug reports? I mean, really?


I didn't personally, but I do think introducing more software development processes into the curriculum would've been beneficial.


> I don't think writing bug reports is as simple as it seems.

Only because most CS students have never taken a real laboratory course.

If you get a hard-nosed lab teacher, you figure out real quick all the information required to reproduce your results. And it's remarkable how much you have to record and how detailed you have to be.

The best lab teachers are the ones who will flunk your assignment if they can't reproduce your results from your lab notebook.


Sounds like a cool course, not sure I'd call it computer science, though.


While there are people commenting on how the techniques sound a lot like a software engineering class, as opposed to a computer science class, I think this approach overall would be fantastic for computer science. Writing tests and documentation are great discipline for assignments. Once these software engineering practices are in place, they can serve as a framework for future assignments.

The HTTP server as a starting point is an excellent idea. This allows for students to see the results of their efforts in an interactive, visual, tangible way. Successfully implementing a search algorithm for the first time is great, but how much more rewarding would it be to see an unsorted list on a web page, a "sort" button", and watching the list sort before your eyes?

Students become trained in one of the most underrated skills in software: communication. They also gain practice in building prototypes to help with job hunting or demonstrating to managers. Does this reframe the curriculum in the context of industry rather than academia? Yes, but I feel it would be incorrect to orient CS around the minority of students who will pursue academic careers anyway.


(Besides this not being "CS" as people are pointing out)

This is good to give some ideas to people that like to tinker and learn by themselves, who are the people needing instructions the least.

The thing is, if students don't have a step-by-step instructions they will fail and complaint, you can tell the author is not a teacher.

Anecdote time: I did MS in CS in an university in the US, in one course we had to set up some XML web service in Java, the prof lifted all the instructions from official web site and gave us the slides with step-by-step commands but he missed one step, so next week nobody except me (who bothered to look up the error and RTFM) had the service set up, this was a 500 or 600 level course.


This is very close to the iteration loop I designed for the onboarding team I am currently running: I'm getting fresh CS grads and need to add the software engineering into their skillset.

I can't say I'd really change up the status quo, though: I wouldn't substitute any of the time they spent on CS to be reduced to include more 'real-world' items: you can focus on those afterwards and they tend to be organization-specific. Give me folks with a solid theoretical foundation and I can work on their client-interaction and big-codebase-team-programming skills.


Sounds like a Software Engineering course. Probably want to add in the rest of Computer Science if you really want to teach Computer Science though.


You've laid out a plan to teach software development. Computer Science might be more accurately named "Computing Science".


This is applicable to an Intro to SOFTWARE ENGINEERING course. As an exercise. Not the primary content. It is not Computer Science.


This is "code monkeying", not "computer science". A valuable skill, to be sure, but let's not mix terms.


Seems like a good start for a class. If he keeps it up, and does a lot more work, he'll end up with a good program.


So go teach CS :-)




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: