Whenever i have someone ask me where to get started on CS - i give them a few options tiered to try and ensure some stickiness/higher utility for them specifically.
~Some Existing Touch Point With CS
Teachyourselfcs.com is definitely in the conversation - in general I recommend it to friends who have a pre-existing "gateway" to the field (software engineer or otherwise). The page talks about progressing from "type 2" to "type 1" software engineer - a deeper understanding affording a richer career/experience.
~Relatively Fresh - but have strong intent
For people who are more "virgin" and fresh but are willing to put in the work - I recommend OSSU ("open source curriculum") - and i've found for whatever reason that structure has let them gradient in with more success. (https://github.com/ossu/computer-science)
~Intrigued/Engaged - but intent is still nascent
For people who have a fleeting interest but don't necessarily have the time or intensity about their interest i usually recommend a starter python course - 90% of these people will fall off the path unless there is a more permeable access-point to the space that offers a positive feedback loop. The university of Michigan has some engaging options.
I remember telling people to read "The Python Tutorial" on python.org , if they wanted to write Python. It takes a few hours for an experienced programer, and a couple of days for a beginner. People had difficulty starting.
A beginner might have trouble assimilating this information - too few examples, not enough entry level drilling on data types, operators, flow control and functions. For example they might forget to put quotes around a string or not know how to use two for loops, one inside the other, even if they know how to use one in isolation. It's hard to grok how to compose things even if the student saw how to use them in isolation. And for the teacher, it's hard to keep the lessons easy enough at that entry level.
When I started programming (with Python) I remember how the modulo operator was introduced, without any further information. I found it quite confusing, since I didn't know what modulo meant (that could be solved with googling) but more important, how it was useful. When you come from a CS perspective, it's completly clear on how you can use it and why it is essential for some computing tasks, but for a non-CS beginner that can be much more obscure.
Quotes to indicate strings have been a problem, definitely. It's odd because it's so clear for me. Yes, I was lucky to dabble in all this a lot when I was younger.
> not enough entry level drilling on data types [..] they might forget to put quotes around a string
Just want to emphasize that first part; I've seen the second in new hires who passed a coding bootcamp, and it's really weird to watch. One of them even had to see the error message and go back to the code and still puzzle over it for several seconds before realizing what was wrong.
I would assume so. Using Intellij Idea helped me a lot, rather than using Netbeans that our professor insisted on.Netbeans has a really slow autocomplete and would slow me down a lot, however Intelllij's autocomplete would pop immediately and would learn from my usage.
I strongly recommend OSSU! Both books and MOOCs have their place, and sometimes a MOOC is easier to stay motivated, provided a schedule, and exercises of appropriate number and difficulty.
I really like reading books too, but sometimes the completion-ist part of me is too strong and I shouldn't really do all the exercises.
In comparison with teachyourselfcs OSSU looks lame, serious. Structured badly, tons of links & strange YouTube channels. TYCS has chapters and 2-3 best resources about, ideal for this case.
For beginners I highly recommend Harvard CS50, the best of the best course available for free and paid too.
I agree that there seem to be a variety of links, but most of the courses linked there are of very high quality and I don't seem to see the "YouTube channels" that you're referring to. One thing I was unsatisfied with with TYCS is how it lists Crafting Compilers for the compilers/PL section of the curriculum. I would argue that more important than the specifics about compilers is a high-level understanding of various ideas in programming language design, and be able to understand the building blocks of different languages and compare the trade-offs of using one language compared with another. Of course, if you go through SICP as an entry point to computing, as suggested in TYCS, then you might be somewhat better off, but it's still not the same as a dedicated course on PL itself.
Dan Grossman from the University of Washington has an excellent course Programming Languages on Coursera: https://www.coursera.org/learn/programming-languages/, which I think would be far more relevant to modern programmers than studying compilers specifically. And I'm glad to see this course listed under the "Core Programming" section of OSSU.
It's remarkable how the course goes from zero to several complete projects in different domains and technologies in just a few weeks. CS50 is a real stepping stone.
The OSSU curriculum has a nice selection of textbooks.
However, I am concerned with the fact that these curated lists lack a unifying idea of what CS is.
If you go to pure math instead, the consensus is clear. A pure math bootcamp, like Math 55, is mostly linear algebra and real analysis, taught from Axler and Rudin in its current iteration.
Simpler math curriculums progress more slowly, or use easier textbooks, but the idea remains the same: Linear algebra and real analysis.
What is the equivalent distilled core of CS? It can't be so many things. There must be a core which you build upon by stacking other courses and textbooks.
My take on this is logic and computation. They are the algebra and calculus of CS, and they are intimately related by the Curry-Howard isomorphism. I find it alarming that CS students are often not taught basics of propositional logic, first-order predicate logic or lambda calculus. It's the basics, and it is really useful.
Software Foundations [1] implements a nice curriculum in line with the ideas I have written about, but it is aimed at graduates and consequently it lacks background. I am still thinking about combinations of textbooks for undergrads that would offer something equivalent. Any suggestions welcome.
Were I to suggest two things to read/watch it would be Nand2Tetris and The Little Schemer. They not only teach the theory but teach you to apply the theory, and the movement of theory to application is crucial to me when discussing computing, an applied science.
N2T teaches digital logic, what Turning saw, how it was physically implemented and how programming languages were and are developed. TLS introduced various topics like the halting problem in an effective and playful manner. Both spark interest, something I find some maths courses fail to do in many people unfortunately.
This "Software Foundations" series feels to me like a focused exploration on PL. I totally agree that a solid grasp on PL theories is actually one of the most helpful things you could do to become a better programmer, and the MOOC by Dan Grossman from the University of Washington is amazing on this. But I'm not sure if this is exactly the same as learning "logic and computation".
+1 for recommending OSSU. The courses listed there seem to mostly be of very high quality, and I'm glad to see the two courses listed under the "Core Programming" section are the two that are among the best I've ever seen. The course Programming Languages by Dan Grossman is definitely much more helpful and insightful in the area of PL than the "Crafting Compilers" book listed in TYCS.
~Some Existing Touch Point With CS
Teachyourselfcs.com is definitely in the conversation - in general I recommend it to friends who have a pre-existing "gateway" to the field (software engineer or otherwise). The page talks about progressing from "type 2" to "type 1" software engineer - a deeper understanding affording a richer career/experience.
~Relatively Fresh - but have strong intent
For people who are more "virgin" and fresh but are willing to put in the work - I recommend OSSU ("open source curriculum") - and i've found for whatever reason that structure has let them gradient in with more success. (https://github.com/ossu/computer-science)
~Intrigued/Engaged - but intent is still nascent
For people who have a fleeting interest but don't necessarily have the time or intensity about their interest i usually recommend a starter python course - 90% of these people will fall off the path unless there is a more permeable access-point to the space that offers a positive feedback loop. The university of Michigan has some engaging options.