The Missing Semester of Your CS Education (2020)
missing.csail.mit.edu
missing.csail.mit.edu
What this content covers should unlock iteration speed, which is the single greatest lever in learning and growing faster (on a computer). Thus it gives you more cycles to go back to improving your code, experimenting with algos, etc. Probably also highly correlated with upwards mobility in the software job market.
Great seeing this under a common umbrella I can hand to students and new grads.
I looked over her shoulder as my wife was doing a CS degree, and I realised there's a bunch of these little things that make life a lot easier if you know them.
This is more or less unique among college majors outside of some arts disciplines like music. Yes, there's a requirement for some secondary school algebra and some basic science but an electrical engineering major could basically have never assembled a circuit before attending college and probably wouldn't be at any particular disadvantage.
And, per the original post, MIT is certainly one of the institutions that does this. The 6.001 MOOC(s)--basically intro to algorithms--teaches a bit of Python on the side but clearly you're intended to mostly learn it on your own.
(By contrast, back in the day, I took a FORTRAN course as part of a non-CS engineering major. The assumption was that you had never touched a computer before.)
I see it more as a trade. There can certainly be some beauty to it. I’m sure coal miners hold some of their own in special regard too.
When I hear people starting their CS degree with C++ or Java, it makes me cringe.
I can't complain, since I was introduced to Emacs along the way, which I still use heavily to this day. And while I don't really use Scheme anymore, it made Elisp trivial to figure out.
It seems completely reasonable to expect someone to be comfortable finding their way around a computer if they’ve chosen to major in computer science.
I’d also expect an entering electrical engineering major has studied more math than just “some secondary school algebra”. They’ve probably already studied some calculus or at the very least are ready to as soon as they start their first semester.
It’s a bit of a red flag to have no foundations in a subject you’ve decided to focus on for the next four years. That said, sufficiently motivated individuals can catch up and overcome their initial lack of preparation.
At that time in your life your entire world has been school, and everything you did in school led to another thing in school. Why wouldn't you assume you'd get taught programming when you applied for a CS course, whose prereq was math that you did in school?
This was my "back in the day" experience as well, though I had a choice between C and Pascal. There was no expectation that anyone had any programming experience. I only had a touch of C64 BASIC knowledge going in.
> I have this feeling that the kids who appear better at uni are the ones who happened to pick up certain not-quite-programming skills before they started. Basics of networking, how installation of programs happens, how to use the command line, that kind of thing.
This one really stood out to me and highlights a change in things since then. That describes ALL of the CS kids during my time. We were the ones who a) had computers and b) did weird things like rebuilding kernals or futz around forever trying to get remote X sessions running.
A fact that blew my mind a few years ago was that, of the 13 software engineers on my team, only 3-4 actually owned a computer other than the work-provided one.
Your point about engineering is exactly right. I built a working radio in my first term, having never done anything like it before, save for acing some physics exams with minimal electricity sections. When we came to coding, I had mucked about a bit with a computer, but I also found other students who'd worked at Microsoft. Wide wide range, and a lot of people of course ended up getting that fellow to email them the solution.
I mean, yes, this was me. I came in knowing most/all of this. I knew six (or more?) programming languages, had at least played with CVS/SVN, had installed Linux (read: fought with the Linux bootloader to get my AMD CPU to boot without crashing), had dipped my toe in a few open source communities.
But I was a tutor in college and I interacted with a bunch of people who didn't come in with any of this experience. Many of those people struggled, but I also know a bunch of people who came into CS knowing nothing, loved it, and went from zero-to-sixty faster than even the people who came in knowing a lot.
I'm still not sure I can identify what the ingredient was, but experience alone is not enough to explain it.
One of the later assignments they gave us this "bomb" executable and we had to use gdb to pick it apart and modify the instructions or find ROP gadgets or something to make the code not "explode". He was my partner in the assignment and I spent most of the time trying to teach him what I was doing in gdb. And trying to express that, sincerely, he wasn't stupid GDB is just really hard and he didn't have the background knowledge to make learning it easier.
um yea thats my job dude and i fought for it so other people should too these people waltzing in not knowing shot should not get into CS
It's not like how it was when I was growing up. We spent $2000 on a Gateway PC that I had full admin access to, and unfiltered internet. Now that kind of money is being spent on cellphones in the household. Because I had that kind of access I was bricking the OS (and reinstalling it), Mailbombing people's AOL inboxes, putting Sub7 on Kaza and Limewire and remotely messing with peoples computers.
The computers at school were only networked my senior year. Even then they were basically wide open.
Me and my friends effectively operated a screwdriver shop out of whoever's house we happened to be at. We were trying to host game servers on whatever we could cobble together.
None of our families had cellphones because they were still only used by businessmen. Computing priorities were way different and how you were exposed to them was different as a result.
None of those opportunities are anywhere near as common now. Kids get devices in schools but they're basically bricks that log everything you do. Computer Labs are rare and their access is fully locked down. Most students first personal computing device is a cellphone, and more likely than not it's an iPhone. All phones are super locked down but apple's even more so.
The market has changed. The days of open computing are now relegated to the back of the line or for those who can afford it.
So it's no wonder a class like this exists. We see similar issues in middle school where students don't understand what folders are or where their files are stored. Phones and tablets make it so easy you never have to think about it. This also extends to collage as well.
Okay then dont.
But they also knew the precise formula for college entrance, and were laser focused on getting into an "elite" school. Any activity that didn't contribute to that process was eschewed.
I have seen devs scoff at the thought of print debugging, but I recall that in systems programming there are many times you can’t use a debugger or need to rely on other tool.
I’d rather schools teach the concept of step debugging vs runtime debugging. Teach students to try to understand the code, make hypotheses, and verify them.
I have seen some people use a debugger solely because they only know how to step debug. Meaning they start from main or another entry point and step through every line of code.
My point being that, you can’t judge a developer by if they use print statements or a debugger. Judge them by the methodology of how they debug.
Next time they do, ask them to recommend a better method of debugging that works across generally all languages, compilers, IDEs, and platforms with next to zero configuration.
Taking a program trace from the print debug statements, grepping through it repeatedly to filter down to certain events of interest, looking at the interleaving of those events, and figuring out the order that things happened in to cause it to go off the rails. That sort of thing. (To be fair, time-travel debuggers can start to get at this, but those are pretty uncommon. Traces, as you say, work almost everywhere.)
Or better yet, compare the traces between working and non-working runs to see how they differ. I've looked at diffs of traces this way before. (Sometimes I'll first use a small script to renumber pointers in traces by order of appearance.)
I've also used this sort of strategy before for debugging rare threading or other non-deterministic issues. Have the shell run the program in a loop, saving each run's trace and results to a different file, go off and get lunch, come back and see if anything failed. Then look to see if any of the runs failed and look for the structural differences between the working and non-working traces.
I can't imagine sitting and stepping through in a debugger 100+ times in the hopes that maybe this time, it will be the run that's just different enough to trigger the bug and that the debugger itself won't prevent the issue from manifesting. Not to mention, trying to remember the steps from all the good runs and spotting where the bad run goes bad before you've stepped to far. No thank you.
I think people really underestimate print debugging. Debuggers are fast and easy for simple bugs, sure, but there's powerful stuff that you can only really do with printed traces.
The debuggers in most popular IDEs (IntelliJ IDEA/any JetBrains IDE, Visual Studio, VSCode, Eclipse) work the same way. You set breakpoints (typically by clicking somewhere around the line number), step into and out of functions, and look at the memory state. If you learned how debugging works in IDE X, you can easily switch to IDE Y without having to learn much.
Not just systems programming, but fixing issues in scaled production systems as well. Have fun attaching a debugger to the process that got killed twenty minutes ago when the spot instance it was running on got reclaimed. If you don't collect telemetry, you're blind. Debuggers are a luxury that you get to enjoy for issues you have before you ship.
Unless you have a setup where you can easily run one system with a debugger attached while connecting it to everything else, you’re basically restricted to running a debugger for bugs that can be reproduced locally.
Now maybe if I was better that wouldn't be the case, but even the cleanest "wish i thought of that" functional code i've seen still looks like it'd be easier to fail fast using a debugger with.
In fairness though, I will admit I use the debugger a lot less when i'm not screwing with reflection on generic types or whatever because runtime errors just happen a lot less in functional styles. Usually if it compiles, it runs, because the compiler can sanity check the code better than you can.
> [uses F#]
That has to be humblebragging. The average .net developer is terrified of or doesn't even know about F#.
What I find is that if my code isn't working, I stop what I'm doing. I look at it. I think really hard, I add some print statements and asserts to verify some assumptions, and I iterate a small handful of times to find my faulty assumption and fix it. Many, many times during the 'think hard' and look at the code part, I can fix the bug without any iterations.
This almost always works if I really understand what I'm doing and I'm being thoughtful.
Sometimes though, I don't know what the hell is going on and I'm in deep waters. In those cases I might use a debugger, but I often feel like I've failed. I almost never use them. When I helped undergrads with debuggers it often felt like their time would be more productively spent reasoning about their code instead of watching it.
Are you aware of the amazing Java debugger feature of "Drop to Frame"? Combined with "hot-injection" (compile new code, then inject into current debug'd JVM), it is crazy and amazing. (I love C#, but the hot-injection feature is much worse than Java -- more than 50% of the time, C# compiler rejects my hot-injection, but about 80% of the time, JVM accepts my hot-injection.) When working on source code where it is very difficult to acquire data for the algorithm, having the ability to inspect in a debugger, make minor changes the the algorithm, then re-compile, inject new class/method defs, the drop to frame, the re-exec the same code in the same debug session is incredibly powerful.
When you're extremely "fluent" in programming code and good at mentally modelling code state, understanding exactly what the code does by looking at it, stepping through it doesn't typically add all that much.
While I do use a debugger sometimes, I'll more often form a hypothesis by just looking at the code, and test it with a print statement. Using a debugger is much too slow.
This varies, but in a lot of environments, using a debugger is much _faster_ than adding a print statement and recompiling (then removing the print statement). Especially when you're trying to look at a complex object/structure/etc where you can't easily print everything.
Early on it was a godsend. Start program, hit breakpoint, look at values, step a few lines, see values, make conclusions.
Now I rely on print statements. Most of all though, I just don't write code that requires stepping. If it panics it tells me where and looking at it will remind me I forgot some obvious thing. If it gives the wrong answer I place some print statements or asserts to verify assumptions.
Over time I've also created less and less state in my programs. I don't have a zillion variables anymore, intricately dependent on each other. Less spaghetti, more just a bunch of straight tubes or an assembly line.
I think it's possible that over the years I hit problems that couldn't easily be stepped. They got so complicated that even stepping the code didn't help much, it would take ages to really understand. So later programs got simpler, somehow.
This could be causal.
Besides, every IDE has a different way to debug, so they might just not be familiar with the interface. I can’t tell you exactly how to debug in VSCode even though I’ve used it the most. I’ve had to run a debugger only a handful of times in the past couple of years and it’s always for codebases that are more tangled (e.g. .NET where there’s interfaces everywhere).
Neither situation was at all related to my talent (or lack thereof).
I’ve been programming in C for nearly 20 years and primarily used printf for debugging for the first 12-15 years, and have used debuggers more and more. I use Emacs, and its gud mode is so nicely integrated into everything that using gdb is truly much, much faster than the alternative. I don’t use print debugging at all anymore.
It takes less time and cognitive overhead to just stop the program on the same line you would have inserted your printf, but you can now inspect the entire program state.
Obviously I’m not saying anything revelatory if you use an IDE on a regular basis… I guess this comment is for the folks who eschew IDEs.
Logging alone is fine, but it can often be difficult not to drown in information. I do embedded programming in C mostly.
I work on compilers and debuggers are more of an hindrance than help when trying to fix a compiler bug.
I believe there is a similar situation for distributed systems.
I used to read every help file on windows / visual c++, the FreeBSD manual, plowed through the file system and tested this it. Just because I was curious
Like you said, it's been a complete game changer. I feel these skills continue to differentiate me from my peers in terms of how I can attack arbitrary problems bravely to this day.
If only I could use 529 funds on some of these online course providers.
https://www.youtube.com/watch?v=ZQnyApKysg4
It's all about leveraging "simple" cli tools and combine their powers to cut through work very swiftly. The opposite of many days for many people.
- Students used to get this stuff but no longer do, for example all workstations used to be unix, so when you left, you "knew" "unix" (shell, vim, etc)
- Due to things like ABET, classes are crammed with need-to-know-for-accreditation info so, well, some items need to go by the wayside (many are in the MIT list)
- There is a huge push, even by ABET, for security and crypto to be somehow integrated into nearly every class.
- Professors seem aware that we need this "missing class", but it is hard for administrators to implement, because: Universities were pressured into lowering credits to grad, so some courses were removed, so there is no room left for another course.
I am not pushing one way or another, and I only have the vision of working at two universities, but I think unis need to take a real hard look at their courses from a holistic point of view. I recall stumbling across that MIT course at least 5 years ago. I do not know many others who implemented something like that.the school I did in france, ENSEIRB-MATMECA, started with three weeks where you only learn shell commands, emacs, LaTeX etc before doing anything else. Here are the slides (in french sorry, although they all have useful reference cards at the end):
- intro: http://mfaverge.vvv.enseirb-matmeca.fr/wordpress/wp-content/...
- unix, shell: https://cours-mf.gitlabpages.inria.fr/if104/docs/01-unix.pdf
- emacs: https://cours-mf.gitlabpages.inria.fr/if104/docs/02-emacs.pd...
- latex: https://mfaverge.vvv.enseirb-matmeca.fr/wordpress/wp-content...
- "advanced" shell scripting: https://cours-mf.gitlabpages.inria.fr/if104/docs/05-scripts....
Citations and bibliography management are easy, it's super easy to switch from IEEE to Harvard or whatever and as soon as you have diagrams, graphs, tables or formulas it's a no brainer.
Pretty curious why you associate LaTeX with "math only". AFAIK it's absolutely standard to use it in CS. It's also quite easy these days. We provide templates for the students and they usually use Overleaf so there's very little hassle with setting up the entire environment.
But I had not considered that during the degree program itself, you will lose LaTeX quite frequently, which of course does make sense.
Yes, mathematicians love it. But computer scientists were first there.
Re: accreditation... the admin is very reluctant to change anything about the courses. Even specific textbooks had to be recommended (I was warned for suggesting in the syllabus that the textbook wasn't needed). Seemed a little more strict than teaching mathematics, which I did in graduate school.
Re: kids these days... a significant portion didn't understand the concept of a file. I blame apps and the cloud (funny because I now work in cloud storage). I ended up writing my own pre-cursor doc to the "missing semester". It was challenge to get a student from not understanding the filesystem to having some sort of understanding of linear search and pointers. (If you're interested: https://www.dropbox.com/s/jar1r0l5vdgspcl/basics.pdf?dl=0)
I tried to stress, especially to the non-majors, that this "missing" stuff was perhaps the most important thing they could learn. That, and how to properly google/search for things. I would experiment and try to re-word homework questions so that interesting StackOverflow answers appeared in search results.
I ended up suggesting those who don't know how to setup a tool chain use VS Code. Not out of any particular affinity for it, but because of the good documentation covering Windows, Linux and macOS.
I have only used pip, cargo, npm (well yarn and pnpm mostly) and composer.
Big off putting aspect of learning C/C++ is that I can’t grok how shared libraries work very well
That's a really interesting pedagogical approach, I like it a lot.
Though I hate Chegg and the like with a passion, since this sort of thing takes a lot of work (over the course of teaching same class a few times) and then w/ Chegg you immediately find the answers.
So when you say it’s a shame your uni doesn’t teach this, well, that’s what these grad students were saying as well. Perhaps the students could seize the initiative at your institution as well?
One problem we have is that the prereq chain for our courses is very long, so adding another course as a pre-req to all others lengthens that chain.
The MIT course offers probably too much info for our purposes, or at least info students don't need preloaded. Just basic CLI and basic Git clone/fork/pull/push are enough for up to probably Junior year. The problem is that the intro courses are so sanitized that students aren't even getting basic CLI until Sophomore year, which means by the time they graduate, they're behind where they should be imo.
You start with 2 weeks of only Linux C + POSIX shell, and during this you're only allowed to use i3 + vim/emacs.
Uni's are requiring more generals, especially humanities. The problem isn't credit requirements, it's accreditation, marketing, and politics.
Note that excellent work in this space is done by the Software Carpentry project which exists since 1998 [2].
[1] https://pde-on-gpu.vaw.ethz.ch/ [2] https://software-carpentry.org/
I remember specifically when one of the exercises for some compiler lecture contained unit tests the code had to satisfy, and I was like, wow, why didn't I already knew about this during algorithm classes earlier where I was fumbling around with some diff-tools to check my output. Let alone proper version control, now that would have been a blessing.
In hindsight, it's a bit embarrassing that I didn't bother to, well, just google for it, but neither did my colleagues - I guess we were so busy with exercises and preparing for exams that we just didn't have the time to think further than that.
So I would say it's good content, but not essential for a CS program.
a) Universities are places of higher learning that do not need to cater to industry
b) There is an implicit social contract whereby universities should produce industry-ready graduates
c) Something in-between
… the skills taught in this course are as useful for the PhD candidate as for the junior software engineer.
Why leave these out or up to the student, then?
Furthermore, in many other academic disciplines, it’s very common to teach applied technique (eg, on writing essays or structuring research), is this any different?
It seems that the course is only 1 month and runs alongside some student-run classes. So this is from the get go not an essential course of a CS program.
There’s probably an aptitude threshold past which the course’s value diminishes - don’t mean any disrespect to anyone, just trying to expand on your point. The top students either have already figured it out or will do so easily, so they might be better off doing something else with the time they would’ve invested in this. But for a lot of students learning about these tools and concepts can be a real force multiplier, more so than a random upper level course.
If your main usage environment is windows, none of these are that helpful, but the ideas could be translated mostly (windows shell is similar enough, that you can just as easily script them with batch files).
There's no conflict or contradiction here, just different strokes for different folks.
A common scenario is that I want to reproduce and extend some earlier research, and there's a GitHub repository for it that hasn't been touched for the last seven years, which was forked from an even older repository that some grad student hastily pieced together. And I need to run components of it on our high-performance computing cluster, where I don't have sudo privileges. So it's whole lot of moving things around between VMs and Docker containers, figuring out what to do about ancient versions of packages and libraries that are dependencies (especially everything that's still written for Python 2.7); either refactoring things to update it all, because I want to take advantage of newer functionality, or setting up some isolated environment with older releases of everything built from source.
In Portugal our computing degrees are Informatics Engineering to use a literal translation, a mix of CS stuff and Engineering. And validated by the Engineering Order as fulfilling certain requirements, for anyone that at end of the degree also wants to do the admission exam for the professional title.
Those that only care about the theory part of CS take a mathematics degree with major in computing.
But name is the only thing we get right in CS education.
Of course, students need to be active in the learning process. But in my experience, it is more likely that professors and departments are terrible at educating than it is for students to not be motivated to learn.
I get OPs point. It's like getting an english literature degree and you've never read a book on your own.
My guess is most people needing the missing semester never coded outside of their assigned tasks. Which is fair enough, but its surprising to me to meet phd candidates who marvel over the missing semester (I've met 2).
This class is an adjacency to an EE or CS candidate. Are universities also failing their students by not offering/requiring a touch-typing class? I don’t think so, in large part because computer science is not programmer occupational training.
Universities can choose to be puritans about what CS is as you seem to be advocating for, or they can be realists and fill a very real gap in skills and knowledge.
Your point about "the topics needed for the degree to be granted" is also a very purist view of the role of university. Is the role of university solely to teach a curriculum that aligns with some abstract ideal of what a particular degree title means? Partly it is. But again, that doesn't match the expectation and the practical reasons why students choose a course. There are very few students studying CS for the beauty of it. Those that do probably do end up in academia and don't need this course. The rest are there for jobs, and they certainly could benefit from this.
I'm willing to bet the answer to both of those questions is a computer programmer.
Universities make assumptions based on the larger student body as to what requirements are needed for admission. Generally, we assume students can read and write and have general computer literacy, but actually the last assumption is starting to fray a bit; more and more, students are coming into school without basic computer desktop literacy. This hasn't been a problem for decades, as students tended just to pick up skills like touch typing. But today, some students are hard pressed to to save a file to the desktop.
I could see universities might actually have to start adding computer literacy as an entrance requirement, the same way we require basic reading and writing and English speaking, so we don't have to teach those things.
I don’t think universities should remove existing material in general to incorporate “bash 101”. Mainly because learning bash is easy and one can learn it by oneself without a professor. Extending the degree one more semester doesn’t make much sense either.
It's not literally an entire semester's worth of material. "The Missing Semester" is just a catchy name they gave it.
The site says:
>The class consists of 11 1-hour lectures, each one centering on a particular topic. The lectures are largely independent, though as the semester goes on we will presume that you are familiar with the content from the earlier lectures. We have lecture notes online, but there will be a lot of content covered in class (e.g. in the form of demos) that may not be in the notes. We will be recording lectures and posting the recordings online.
And in that paragraph the word "semester" it doesn't mean a normal full-length semester:
>The class is being run during MIT’s “Independent Activities Period” in January 2020 — a one-month semester that features shorter student-run classes.
So, 11 lectures over the course of a month (actually three weeks if you look at the listed dates). And it's an unofficial class taught by grad students, alongside other classes.
If a CS program made this official, it could fit into the first two weeks of the course. And that'd be a great thing, since these tools make you way more productive in everything computer-sciency you do. It's like compound interest: the earlier you get good at the shell, the bigger the returns.
I think they call it the "Missing Semester" because
a) it's as useful as an entire semester
b) when you don't already know this stuff, it seems much bigger and more difficult than it really is. and your fellow students who already do know it seem like they're a semester ahead of you in comparison.
c) it might take you a semester to learn the material if you don't have instruction, feedback, a roadmap, while you're juggling your other academic obligations. people remember the things they succeeded in teaching themselves but forget the immense wasted time of rabbit holes they went down because they didn't have a mentor to guide them.
-----
I didn't study CS, I studied Physics instead. My hands-down favourite course, the one whose material I still use even though my day job has nothing to do with physics, was called something like "Problem Solving for Physicists" (google "university of sheffield PHY340", you can find PDFs of past exam papers to see what I'm talking about). It was this lovely hodge-podge of material, much of which had nothing specifically to do with physics at all. It had stuff like dimensional analysis, how to come up with sensible approximations and Fermi estimates, how to sanity check your calculations, coming up with lower and upper bounds, how to rule out certain classes of solutions even when you can't find the exact answer, that kind of thing. It was in the second or third year of my course, I forget which, but either way nothing in it had more than high-school level mathematics, so it could have been taught in the very first part of the first year, before we even did mechanics 101. That would have been tremendously helpful for everything that came afterwards. That was my "Missing Semester" (or perhaps, "Misplaced Semester").
When I saw the title I figured it was another "computer science" class. But the curriculum was a significant portion of what I lacked when I graduated, which prevented me from finding work for a year.
Had someone at university told me before I graduated that I'd have no chance of finding work if I didn't know Git, Linux, REST, how to use the command-line, how to use an IDE, how to use an editor on the command line, and bash, I would have prepared myself for those things.
Did your interviews ask specific questions about Git, Linux things not covered in a standard operating systems course, and command line editing?
Did they specifically ask about them in an interview?
Also, since I wasn't using git (and hadn't even heard of git or github until after I graduated; mind you, this was in 2012), I didn't have any visible work to highlight when responding to job listing. I also didn't have any demonstrable ability to collaborate, dive into existing projects and find my way around, or do things like make PRs.
I didn't have anything to say about my ability to work with software tooling, using an operating system beyond just opening a web browser, notepad, Borland C++... I think I used netbeans for a group Java project also.
I definitely wouldn't have been able to demonstrate editing a file on the command line. Most tutorials were too dense for me without significant head-desk banging, because they assumed you knew how to compile a file, or run make.
Yes, we did do a lot of these things in a very limited way for our classes, but the teacher would always tell us exactly what we needed to do, and the very small amount of actual programming we did in our program didn't require me to know how to do something like debug the code, enable linting or error highlighting in the IDE (it was mostly simple enough that I could get it right, or close to right, with a few tries anyway).
I know these things contributed to me not getting a job, because I spent almost a year learning them and more, and was able to get jobs after.
All that said, I didn't do an internship, I didn't have a good GPA, and my school wasn't considered good. I was about as unattractive a candidate as I could be while still having a CS degree.
I see where you're coming from, but sometimes you don't even know what the necessary skills are. Even if you're very self-motivated and enthusiastic, you can still benefit by being pointed in the right direction. That's part of what a good school or teacher should do for you. (And while they're at it, they can provide materials that smooth out the path to get there.)
You should never expect them to cover 100% of that, but if they're aware of a way that they can get closer to 100% than they currently are, then it's a good thing for them to do it.
The latter is the solely the responsibility of each student, but I don’t understand why the former would be. Some of the content in this course strikes me as unknown unknowns for new programmers. Why would they be to blame if no one told them to learn a particular skill?
I think we expect that in comp sci just because many of us did happen to grow up doing that. But it's a weird and unusual expectation, and probably not a good one.
It also certainly wouldn't have been expected a few decades ago. You just wouldn't assume that a kid had a mainframe in their house to have learned on. Now that PCs have been around for awhile, we make that assumption, but again I don't think it's a good assumption. Certainly not for the less-affluent, nor the younger ones who grew up with smartphones and tablets instead of a PC.
I think there's also a bit of disconnect in what the purpose of the major is. Actually having a separate 'Software Engineering' major is relatively quite new and generally, Comp Sci was what everybody took if they wanted to learn to work on software. But now some people think it's a totally academic thing, while others think it's industry training, and that always confuses the discussion. But even in spite of that, it's just a bad assumption/expectation.
Different majors have varying degrees of difficulty for different people. By and large schools don't (and shouldn't) get into the business of heavily policing who gets to give a particular major a whirl.
We learned the basics of the shell, file system, file editing, AFS ACL's for group projects, and more. It looks very similar to this MIT course which makes sense as our school's computing environment was based on MIT's Project Athena and AFS (Andrew File System)
https://en.wikipedia.org/wiki/Project_Athena
I looked and the same course is still mandatory for incoming engineering students.
I'm in the semiconductor industry and everything runs on Unix / Linux. Back in 2000 we would get new grads that knew very little about Unix, command lines, or scripting. That kind of stuff is half my job. These days Linux is so popular that most of the new grads know this stuff.
Dijkstra was full of it. He wanted CS to be just a branch of abstract mathematics but that's never been the case. That's a retconning of history by people with math envy. Before Alan Turing had ever heard of the Entscheidungsproblem, he had already built simple mechanical computers with his bare hands.
It's cousin to a stupid mindset you see in software engineering, that you can somehow be a good engineer while not knowing what your hardware is actually doing. That's how you get complicated architecture-astronaut systems with good theoretical big-O characteristics, that get crushed by a simple for loop written by the guy who ran a profiler and knows what a cache line is. We live in a world made of atoms, not lemmas.
Research fields go rotten when they don't come into contact with reality enough: quantum computing, string theory, etc.
And as for astronomy: knowing how telescopes are constructed, how they work, their optical characteristics, limitations, failure modes, all of that is essential to observational astronomy. And if you study astronomy, you sure as fuck are taught how to use a telescope!!!
Astronomy as we know it didn't exist until we had good telescopes. Cosmological theories have risen and fallen on the advances in optical theory and engineering. Astronomy is very much about telescopes.
What other field is so ashamed of its own tools? Like, art isn't about pencils, but art students are taught how to hold a pencil! Stop repeating this thought-terminating cliche.
I estimate that astronomers need to know about tradeoffs on a telescopes' settings for the data they are looking at. But I'm unconvinced that they necessarily need to know how to operate it (would depend on the workplace) and I certainly disagree that how they are constructed is absolutely necessary for all astronomers.
More knowledge is always good, so of course learn what you want. But it's not being "ashamed of tools" to say that a CS degree should "do one thing and do it well".
Additionally, we can simultaneously say that a university should encourage tool mastery while also saying that they don't need to teach entire courses on it.
You know what you're not going to be able to pick up at your first software engineering position? Discrete mathematics or linear algebra.
However, knowing the tools of the trade is something that is invaluable. And yes, it can be picked up on the job, but deliberate learning and practice is more effective and less stressful.
Directly, sure. I do think there is something about the rigor of the math thought process that lends itself to writing software. Thinking through algorithms and proofs is really not much different than writing code or debugging.
Even with tools I think learning concepts are better. I've used so many IDEs through my career, but they are all roughly the same conceptually. One thing that has helped though is embracing vim keystrokes and using them everywhere.
> Independent Activities Period (IAP) is a four-week period in January during which faculty and students are freed from the rigors of regularly scheduled classes for flexible teaching and learning and for independent study and research. IAP is part of the academic program of the Institute—the "1" month in MIT's "4-1-4" academic calendar. Students are encouraged to explore the educational resources of the Institute by taking specially designed subjects, arranging individual projects with faculty members, or organizing and participating in IAP activities. They may also pursue interests independently either on or off campus.
http://catalog.mit.edu/mit/undergraduate-education/academic-...
We’ve also shared this class beyond MIT in the hopes that others may benefit from these resources.
Thought one: they should make this an official OCW thing
Thought two: OCW class resources should be a two way street, like open source development, not just a "throw it over the wall" model.
Not that I'm criticizing MIT for making any content freely available, mind you. Any free, high quality, educational content makes the world an overall better place IMO. No, it's just that I saw this bit:
Editors (Vim)
and couldn't help but think "Great, but what about Emacs?" Which got me thinking something like "Well, why couldn't I, or somebody else (preferably somebody actually qualified) create a corresponding 'Editors (Emacs)' section and contribute it back?"
I dunno, maybe it's a nutty idea. And certainly for the stuff that is released by OCW under corresponding open licenses, I suppose one could "fork" the class somewhere else and run it on a model where outside contributions are accepted. Anyway, this just got me thinking about this concept.
EDIT: never mind, I actually just noticed that this particular course actually is on Github[1], and they do accept pull requests! Very cool.
Would still be cool to see that approach become even more widespread for OCW courses (both from MIT and elsewhere).
[1]: https://github.com/missing-semester/missing-semester/pulls
it's worth knowing an editor that doesn't require 6GB of RAM and a graphical environment, but it's probably not going to be most folks' primary editor. ;d
Sooo many choices. I started[1] programming on a 5 MB machine with ~4 MB free.[2]
But I'm not allowed a GUI? Ok… then, I'll choose an editor with a keyboard-driven menubar across the top (keyboard shortcuts appearing in the menus), a status line on bottom, and as many keycombos that match my preferred GUI as possible.
Failing that, I can muddle along with Nano.
Until some once-in-20-years task actually requires using an arcane 'editor' that assumes I live in PDP-11. (^:
[1] Wellll… I sometimes forget typing BASIC from magazines into an Apple II and making small changes.
[2] And it was luxurious…until I tried to fit 8 MB of a CD-ROM app into compressed RAM.
Neovim allows me to specify the precise minimum I desire to have a fully functional IDE-like experience (basically treesitter + LSP + DAP + minimal extra plugins).
It's super fast, I'm already in my shell, and my memory usage gets to stay super low :)
Plus - modal editing :)
rename all instances of class/method/variable -> f2
count TODOs: too many vs code plugins that will do that for you
Not sure when the last time you checked, but vs code is a practical full fledged IDE with the right plugins.
That said - I haven't used it in years. Way too heavy and Vim does all of those + modal editing.
The only thing where vim/neovim really sucks against other tools is the project specific configuration.
More useless words have been spent over editor choice than .. "how good is Linux?" or "how terrible is Electron!" or any one of the handful of sometimes entertaining and always vacuous areas of argument software people frequent over their peccadilloes.
Using vim motions? Everywhere. All the time.
Vim becomes a state of mind, a model for editing that is really empowering. I can translate any thought to code by doing a little dance on my keyboard. My mind is freed by this expression.
Honest, I’m not that attached to vim and mainly keep using it because it’s what my colleagues use. If everyone suddenly switched to VSCode I would follow the herd. The only thing about vim that I love, and would not give up, is the keybindings and I am sure I could find a decent plug-in for that.
If I need to do anything in a professional environment, I boot up intellij/vscode/whatever they use and just install a vim emulation plugin. Vim is fun and all, but when time is money the last thing I want to worry about is configuring my editor.
But I don't think anyone can avoid learning how to quit vim. We've all been there, you think you know the keys, you don't, now you are trapped.
BTW: Pops up every year seemingly. E.g. 3yrs ago with more than 1000 comments:
Being moderately competant at jq on a team that doesn't know jq is a super power.
To give an example from another context: This is a bit like asking "why would you use document.querySelector() instead of just looping over childNodes directly?"
I get that they chose Vim because it's more popular, but it feels as weird as taking a course from Apple that teaches you how to use Windows.
Instead of a whole lecture on Vim they should rather teach a modern editor like VS Code or how to use a real IDE like IntelliJ. With these modern editors you also get refactoring and a Gui for Git, which makes it much less painful to use.
So all in all its a good start, but already outdated on several topics.
* CS251 - Computing Laboratory - 1 - https://www.cse.iitk.ac.in/pages/CS251.html
* CS252 - Computing Laboratory - 2 - https://www.cse.iitk.ac.in/pages/CS252.html , and
* CS253 - Software Development And Operations - https://www.cse.iitk.ac.in/pages/CS253.html
For example we have a sophomore fall class called Linux/Unix Programming that covers about half of these topics and a sophomore spring class called Open Source Software Development that covers the rest (and philosophy, history, etc.). We have an advantage for this sort of work, though, in that we’re not a prestigious research university, but instead a small teaching college that calls ourselves “professionally focused.” Meaning while we have a CS degree, we acknowledge that 90% of our graduates will become software developers. That approach means that while theory is still important, tools for software development are very intentionally incorporated as part of the core of what we teach. Think of it as a blend of CS and software engineering (which is also one of our concentrations for a deeper dive).
We had a UNIX tools and an Advanced Programming Techniques course. Both gold. Taught from the sausage dog book and the Unix Programming Environment book iirc. Totally standard texts I thought?
Link to sausage dog (ha!): https://en.wikipedia.org/wiki/The_Practice_of_Programming
Advanced Unix: https://en.wikipedia.org/wiki/Advanced_Programming_in_the_Un...
Some of it is old hat, but TPOP ages particularly well due to its lack of language specificity. Something we could all do with :).
That experience taught me so much and I still use most of those learnings on a day to day basis.
This is an actual issue. Some students show up at college without ever having written a line of code and without knowing how to open a plain text file, make changes to it, and save it.
It doesn't matter that much which one you learn. If you already have an opinion about which one you like better, you're already where you need to be and can skip the section on editors. If you learn vim and don't like it, you can learn a different editor.
What you'll think you know about "how editors work" will be actively harmful. I've seen and heard of people resorting to pressing the computer's reset switch when they can't figure out how get out of a 'real' textmode editor whose behaviour defies all commonalities. And good luck getting to the man-page if you can't get out of the editor.
When I've needed to use one of those, I fortunately had been provided exact steps or had a 'real user' who could help me. I've had a few goes at the man-pages ages ago (which were not installed on one or two systems!), but paging through them just made 'real' editors seem even more like "not a usable editor" to me. Too dainbramaged by having grown up with 'intuitive' editors that give more affordances.
[Edit: missing word]
Vim is like Dvozak keyboard. Consistency and standardisation is more important than 1% performance improvement.
Every system I've ever been on has vi and nano and usually vim.
Writing performant code? He does a fine job.
Setting up an environment, navigating a couple terminals and getting code into revision control? He is completely lost. Someone basically has to do it for him.
I’m going to send this course material to his manager* and hopefully a few weeks from now the team stress levels will be greatly reduced.
*yes, company culture dictates that it would not be appropriate for me to flat out say to him “dude you suck and here’s a way to be better”.
I’m glad they did that. Because I ended up learning bash, profiling, debugging, etc. all by myself. I would have never learned by myself in my free time the pumping lemma, for instance. So, all in all, I’m grateful my uni didn’t teach me “useful” stuff.
I don't know what to make of this. :-)
Nothing like fighting the software for hours the night before to animate something and, the next day, have my professor show me how it could be done in 15 minutes using a property or tool I didn't know existed.
It was not only assumed but explicitly stated that AfterEffects and, Illustrator, which is commonly used alongside, were too time consuming to teach and we would just have to dive in on our own.
In the interest of saving others from that pain: https://youtube.com/playlist?list=PLjNI3J96cKVKmujglFYJEkHzZ...
A YouTuber (Jake in Motion) made a series of videos demonstrating every effect and tool in AfterEffects. They aren't deep but it's a fantastic resource to get you started.
I just wish this had been around when I needed it. Hats off to MIT for providing the same to others.
To provide the students with the skills they'd need in their career, we taught them how to use real world tooling: how to make a website from a design, how to use Git, how to write backend code, identifying security risks, how to use editors that weren't JEdit or Netbeans, how to use PhoneGap, how to deploy to a server, how to use Unix.
As a result of our training, we managed to get some great students on-board. No longer were we surrounded by students who could make some ServiceFactoryBean, but instead ones who were fully capable of making real things in a real company.
It's awesome to see that MIT has a similar programme - covering all the skills that we actually did teach. Too much of university is spent theorising and not spent making students employable.
The class is still called E115 and I found the online text book. It has definitely changed in the last 30 years and the MIT course is probably a lot more in depth but the concept is the same.
You have students coming from high school that may have only used Windows or Macs. I've heard that a lot of students have got used to iPads and cloud storage don't even understand the concepts of files or file systems.
Software Carpentry has some similar, OER lessons: https://software-carpentry.org/lessons/
[0] https://missing.csail.mit.edu/2020/metaprogramming/#a-brief-...
Very practical, and vocational, so they had stuff like this (but for E Techs).
Universities tend to be less "vocational," so may skip some of the more practical stuff.
Also, developing a curriculum is a huge pain in the butt, and keeping it updated, is even worse. Stuff like this tends to be highly topical, so it needs to be kept up to date, with almost no lag.
But this is great.
I remember that after watching that lesson I straight up wrote two big bash scripts that made users download recorded lessons directly from WebEx and MS Teams.
VUSEC: learn about systems security!
In your own time figure out:
- git
- vim (you wanna be cool right? Btw, use vimtutor in the commandline ;-) )
- C (okay okay, it was a prerequisite, I didn't have it, haha, so learned some basic C in a week to do the assignments. I knew Java only at that point)
- ssh
- Many other things
Software engineers are way more productive if they know their tools.
They taught command scripting and code management later.
Debugging was a black art.
On the other hand, the idea of piping your log data to a statistics package or gnuplot is fascinating. It could have benefited from showing some output from those programs to illustrate the kind of things you can get from it.
not to discount the initiative itself, but bachelors in cs is more about the core cs theory that will be valid decades from now, unless the entire paradigm changes.
Not saying you're insinuating that. Just curious about AIX.
For example, it uses COFF (although it also does ELF), the shared libraries also use export files, are private by default, and allow lazy loading on demand when symbols are touched for the first time, just like on Windows.
The TUI tooling to manage the OS is similar to what the other IBM platforms use.
Not much I can remember, the last time I used Aix was in 2002.
make can be a career in and of itself.
Wouldn’t say I’m a particularly proud alum. They dropped the ball on a wide swath of other topics that I would consider integral. For instance, distributed computing should be a more common undergrad elective, not something you get blindsided by when you get out of school. “Sorry, you said Who-bernetes?” Now, I get that Kubernetes is a relatively young project, as is Docker and other containerization tech, but it is nonetheless staggering how school felt like it was 10 years behind the ‘cutting edge’ when I was there. They seemingly had no interest in educating engineers to go out and join the web community unless that individual sought self-guided study.