9 ms·
Path to a free self-taught education in Computer Science
- grawprog 9y agoI'm going to show this to my co worker. He was telling me the other day how he felt trapped at his job and wished he could learn computer science but didn't feel like he'd ever be able to get the money or time to do it.
- neospice 9y agoIf you don’t mind me asking, what does your co worker do for a living?
- grawprog 9y agoHe's a hand polisher at the granite shop we work at. He's been doing it for 8 years since he came to Canada from Iran. He needs to get some kind of highschool equivalent but ended up in an arranged marriage with children and had to sponsor her and his parents to come over. It sucks he's a great guy and one of the hardest working people I know. He also blames his english. I've heard a lot of people with English as a second language use that as an excuse and, like him, it's usually from people who tend to speak and write English better than a lot of native English speakers I've met. Since then I've offered to show him some of the machine work I do and have tried to explain more about programming the machines to him. He seems excited to learn so I think he'll enjoy stuff he can learn at his own pace. The funny thing is I've actually learned a lot of things about computer science written by Iranians or other people who English was not their first language. It's a barrier but not as much as i've heard so many people make it out to be especially if you know enough to read, write and communicate.
- neospice 9y agoThat is fascinating. I hope your co worker finds success in the future. Thanks for sharing.
- otachack 9y agoIf anything it's time that's the hardest to commit, in my opinion. But even setting an hour to two on a weekend aside for something you want to do is something. Good luck to your coworker for whatever path he chooses!
- hackermailman 9y agoTell him to apply to UoP and get an accredited degree tuition free online https://www.uopeople.edu/programs/cs/degrees/computer-science-bachelor-degree/ https://www.uopeople.edu/programs/cs/degrees/computer-scienc... it's $4k or so for 4 years of exams ($100 each). Problem with self-learning courses is most people decide to skip things they believe won't be useful but actually are, which is why they are in the university curriculum, then later they get lost since they didn't do all the pre-reqs. UoP also has TAs
- brailsafe 9y agoFWIW, I thought you were referring to UofPhoenix until I read the URL. Haven't heard of UoPeople but thanks for sharing. Do you know anyone whose had success with their programs?
- itsmemattchung 9y agoI've followed this github project for the past year and a half and although I find the repository full of amazing resources, I still find it unsuitable (for my own needs) since there's limited (to no) feedback -- necessary for learning -- from a dedicated resource (I.e professor ). However , the project maintainer(s) are aware and working on addressing this -- as well as other -- issues; its worth noting that this problem isn't esoteric to this project , but many other (free) online resources .
- BoysenberryPi 9y agoJoin a programming community and ask for feedback on your exercises/projects. Tons of communities out there. Not saying this is a non issue but the fix is pretty simple.
- B4TMAN 9y agoAre there communities beside reddit/HN/SO?
- anonemouse145 9y agoWe really need to quit forcing programmers to take calculus. Even set theory is a minority of us. Nobody actually needs order of magnitude either, so long as you can tell one thing is bigger than another which is about one day of learning after you cover polynomials. The vast majority of us never use more than basic algebra. Counting, multiplying and dividing money, and estimating effort in story points (and maybe dollars as you get seniority) are the big math items. I'm horrible at calculus, a fault that cost me around $30,000 in makeup classes and a delayed graduation as I kept losing scholarships. Yet I have never, and will never, use Calculus in my field. This was told to me by the career coach in my intro class, who said almost none of you will ever use Calculus, yet my school still made everyone take up to Calculus 4. Who the hell is finding the area under three-dimensional curves without relying on a library? Madness.
- dboreham 9y ago"Programmers", sure. But for a professional, degreed practitioners let's have some proper education please. What the heck is so hard about a bit of 17th C. mathematics anyway? Or are we talking about more advanced topics like "Analysis" (19th C.)? Either way, I don't want a dumbed down low wage profession. I'm looking for parity with at least doctors, accountants and high school science teachers.. By the way, I am wondering if you had some bad teachers who themselves failed to fully understand calculus. Good teachers make all the difference.
- jecxjo 9y agoI totally agree. We are slowly deluding our profession by reducing it down to a few online courses. The vast majority of college is not about learning a specific topic. It's about being given a wide range of problems to solve in very different and complex topics that stretch your abilities. I've been amazed at how many programmers I've interacted with in the past two decades who cannot operate outside the one, small subject they currently know. It's one thing to say you can't work on scientific modeling because you couldn't do Calc, but when I see front end developers who say "nope I can't do back end ever" I realize that they were never challenged and they will be the last person I want on my team. I want to have an employee who says "I don't know that topics but I'm going to learn it and solve this problem!" Dumbing down our profession doesn't help us.
- junk_f00d 9y agoHere's a couple more: >https://teachyourselfcs.com/ https://teachyourselfcs.com/ >https://functionalcs.github.io/curriculum/ https://functionalcs.github.io/curriculum/
- jcadam 9y agoI'd really like to pursue a PhD in Comp Sci (My BS is in CS). But with a family there's just no way. If I kept my full-time job, I might have the money to do it, but I wouldn't have the time. And vice-versa if I quit my job and became a full-time student. I did go and get an online Masters of sorts (an MBA from WGU), which was definitely do-able while working full-time (and also useless), but it was nowhere near as rigorous and time-consuming as an engineering graduate degree would be :)
- hackermailman 9y agoWork for any university as an outside contractor in a research programming position, example: https://cmu.taleo.net/careersection/2/jobsearch.ftl?lang=en https://cmu.taleo.net/careersection/2/jobsearch.ftl?lang=en You work with PhDs, so can pursue your graduate interests directly from them while being involved in the research, and get paid at the same time albeit not industry standards, prepare for lower salary. Open AI hires developers too and plenty of researchers are there.
- albertgoeswoof 9y agoIt is frustrating that education requires so much wealth. As a young adult I was completely focused on getting a paid position out of my degree and took internships based on pay alone. Despite a professor pushing me to stay onto further education and easily getting a 1st, I couldn’t justify the costs of continuing. Having seen what poverty can do to someone I have always put securing my future financially over my education, in the hope that one day I can return to university and resume. And I am one of the lucky ones who could afford / was explained benefits of an education from a young age.
- imakecomments 9y agoA PhD is paid. Universities near me pay around $30,000+/yr.
- jcadam 9y agoEven so, I could never get my family to agree to a ~$100k/yr drop in household income :P
- Goladus 9y agoCan anyone explain to me the continued prominence of "Object-Oriented Design" as part of a fundamental computer science curriculum? It seems to me that the basics of OOP, the kind of things that most programmers need to know about, can be covered in a single lecture or two as part of a general programming or software engineering class. Java-oriented design patterns and general API design seem more appropriate as an advanced/optional offering for students who are interested. The linked curriculum has 6 weeks dedicated to Object-Oriented Design in the intermediate part of the "core programming" section. It seems like that much time could be spent on something more fundamental.
- robotresearcher 9y agoThis is explained by the teaching staff having been there for 25 years and no effective process in place to force them to change the curriculum. I’m a CS professor. My colleagues and I have complete control of the program. When you see an outdated program it’s the faculty’s fault in general and the leadership’s fault in particular for not forcing the issue.
- Goladus 9y agoNot that my opinion matters, I don't have any advanced degree and no experience building curricula. But if I were going to include OO in a curriculum here's how I'd do it: 1. (Intermediate/Core) I'd cover basic OO in Python. I'd demonstrate basic features like instantiation, introspection, properties and methods before moving on. I would not cover defining new classes before I had covered creating a dispatcher with first-class functions in a hash-map/dictionary. I would not cover defining new classes unless I could cover pros and cons of using OO style versus simple functions that accept rich data structures like lists and hash-maps. 2. (Intermediate/Optional) I'd offer Java, C# and(or) Smalltalk classes at the intermediate level, where the goal would be competence with the chosen language's implementation, tooling, ecosystem and common programming idioms. These classes would involve object-oriented principles, given how important the paradigm is to these languages, but it wouldn't be the sole focus of the class. Edit: Also C++ if possible. 3. (Intermediate/Optional) A design patterns practicum. (Visitor, observer, factory, etc.). Just a programming-heavy class where you solve problems using as many of the common design patterns as possible. 4. (Advanced/Optional) A bottom-up class where we'd cover implementation details of object systems in a low-level systems language like C. Perhaps a semester-long project might be to build a working object system in C. The pedagogical goal would be impart an understanding of the kinds of problems that object-oriented programming was invented to solve by relying on first-hand experience rather than dogmatic instruction and hand-waving about the evils of procedural style. 5. (Advanced/Optional) An Object Oriented Design class that would cover issues in designing large-scale systems using object-oriented programming. It would cover issues relating to inheritance, Object-Relational Mapping, and API design. This is where you'd cover UML and that sort of thing.
- constantlearner 9y agoI'm learning programming on my own. I don't have a formal CS education and cannot afford it. Do I need to pursue all this curriculum to become good at coding? It seems overwhelming, but I'm not against learning and am not in a rush. Currently I'm not a professional programmer. I started answering at Stack Overflow and Reddit a couple months ago and am doing really good. I like C and Python, but I regularly write in the latter. My GitHub repo has some programming exercises, has about 300 stars and 50 forks and it happened within a month's time and I'm releasing some more exercises soon. I had to discontinue my education after 10th grade, but my love for English and math has never faded. I had worked in health information for about 15 years, had a passion for it, excelled in it. My employers never asked about my formal education. They wouldn't believe me if I told them the truth. I quit my previous job for learning programming full time because I like this more than anything now. I want to spend the next 15 years programming and learning math. These two and I are inseparable. Born in a village in a third-world country, I learned English by listening to BBC Learning English and VOA Special English radio stations. As a kid, I loved grammar, syntax, punctuation, vocabulary. This is not my best writing :) I have another handle on HN and it took me about 250 days to reach a 14,000 karma here.
- brailsafe 9y agoNo, you do not need to pursue this whole curriculum to become good at coding.
- constantlearner 9y agoI knew it. Programming is part of computer science. Now I say CS is part of math :)
- ilaksh 9y agoSeems like a great list. One criticism: I believe that the majority of programming jobs are software engineering jobs (even if that's not in the job title). Since many are using CS as prep for programming careers, I believe this list may need more emphasis on software engineering and contemporary skills and knowledge in SE. For example, I saw testing in the advanced section if I remember correctly. But it was one of multiple options I think. Doesn't everyone need some testing knowledge/experience? Another one is requirements analysis or negotiation. Figuring out _exactly_ what needs to be done, in a way that makes complete sense all the way through, is feasible and high priority, isn't nonsense from a UI or database perspective, and getting the other people to go along with that, is pretty important to most programming jobs I have had. Another example: back in the good ole' days of CS, large scale code re-use may have been mostly a dream for most popular programming language ecosystems (that weren't Perl). But now, even though dependency reduction still seems much cooler, being able to use real package management systems and select the right modules or components is critical for most jobs. Not sure that type of thing gets quite enough attention in this list.
- harrisjt 9y agoDo people get testing experience in a CS degree? For me it may be a small part of my software engineering course but that would be it.
- imakecomments 9y agoIn my experience, at my school testing is done to pass a professor's designed test cases. Usually you don't know the professor's test cases in advance.
- xtiansimon 9y agoAs a self-taught programmer I hoped for one of these to explain whatever I needed to wrap my head around "frameworks"--abstractions which make it possible to build the vast diversity of programming development tools built on top of programming languages, while themselves being written in that language. You can learn about the idioms such as Callbacks and Hooks, but to really grasp how these are organized into frameworks seems difficult for authors. It's easier to just tell you, If you want this effect, Do that. Or, I'm just not getting something about computer science pedagogy; Maybe the domain of programming where I find my interests doesn't teach programming the way I think about learning it. I will dig into this to see what's here.
- barrkel 9y agoCS doesn't really cover software design at the level of programming language idioms like callbacks. The closest it might get is lambda calculus and reasoning about code as graph reduction, where code is just a data structure. Software engineering might cover design patterns, but even then it's a limited set of techniques with broad application - idioms in practice are tuned to their language and execution environment, because clumsy idioms don't propagate.
- grawprog 9y agoFiguring out how to put those things together to make a cohesive library or program is the hardest thing I've had to do on my own. I haven't really found anything that teaches that. There's lots of begginer stuff about syntax and programming concepts. There's some fairly technical abstract stuff out there about algorithms and data structures but not a lot about how to put everything together into a useful program. The only way I've learned that was to just start making things. Whenever I ran into a problem i'd look up whatever I was having trouble with. It failed a lot. I've had to go back an restart things more than once or endes up giving up on things that were dead ends. Then after a couple years of that I stopped having to quit because i'd completely messed up the idea of what I was doing. I honestly have no idea if the things I've learned are correct or not but programs I write seem to do what they're supposed to now. I think the reason why there's not much about how to put programs together is that it's pretty much up to you. There's a million ways to do one thing and most programs have a million things that need to do one thing. You need a good idea of what you would like these things to be. Then you pick one and do it, then another one and another one making sure the first things you made still work with the new ones. If you don't know how to do one of the things either look up and see how other people did it or move on for a bit and come back to it. A framework, library or program is just input data, either from you or a user, processing of data and output. It's up to you to figure out how to structure these things for the needs of your program. There is no right way, just whatever way you find that works. You can look at a program like building a machine. The programming language you learned gives you the nuts, bolts and basic materials you need, the algorithms, callbacks and hooks are the different prefabbed parts and you're the mechanic that bolts it all together with a wrench and a whole lotta grease.
- godelmachine 9y agoA suggestion for the section - “Computer Science - Great Readings”. How about “Readings in Computer Architecture”? While I’m aware it’s a tough book to read, and there are already books like “The Elements of Computing System” (NAND2TETRIS) and “Computer Organization & Design : The Hardware Software Interface”, which suffice in getting acquainted with hardware architecture, Readings in Comp Arch will take reader to the transistor level. Any other book suggestion that takes reader to the transistor level would be appreciated.
- jackyinger 9y agoComputer Organization & Design : The Hardware Software Interface by Hennessy and Patterson is a great book for any coder that is interested in how CPUs actually tick. However I don’t think knowing the gorey details of transistors is necessary. What they need to be aware of is cache hierarchies and pipelined superscalar processor architecture. These sophisticated architectural features can be flouted by code that causes them to behave poorly. Such as code that does random accesses in a large buffer causing the probability of the desired data being stored in cache to be low. The ways in which real computers differ from idealized ones is what CS students need to know. Also CS students ought to have to learn to read others’ code.
- aminukano 9y agoThis is quite awesome.. I'm gonna use it!