Looking at the information about version 2 on Amazon, I see that the authors fixed a lot of issues with version 1, and they made the code compilabe in all modern Scheme implementations adhering to the language standard.
Structure and Interpretation of Computer Programs will introduce you to imperative programming, functional programming, data structures and a lot more. It will change Joe you think and help create a foundation towards being a better programmer.
This book is 22 years old, but it is the functional programming bible. It's in scheme, but the functional concepts are universal. If you really want to learn functional programming, why not go full bore and learn it in a functional first language like F#? You could even go the extra mile and learn functional programming in a dynamically typed language like JavaScript. Node.js is becoming very popular in the industry so learning it could also be lucrative.
Honestly, if they are already using DrRacket, The Structure and Interpretation of Computer Programs (SICP) has aged very well and, for an undergraduate class, is probably at least as good as anything else. You will want to strategically choose which parts you cover. It is still being used at MIT, for example.
(Edit: SICP, not SCIP.)
I'm guessing you'll find good threads on this in r/learnprogramming and r/cscareerquestions.
I think there are two paths you can take: learning specific skills (languages, systems) vs learning fundamentals. For the first, obviously the choices depend a lot on what you want to do. (One next thing might be to learn how databases work? There's a great Stanford online class about this though it may be rough if you have little CS background--there's no real programming in though, just query writing iirc.) The second may be harder to get motivated for, since it will feel a little abstract. I think it's valuable to have a rough understanding of what you're asking for when you write code that uses a certain amount of memory (even if it's not explicit), or ask it to find something in the DOM tree, etc. to have a sense what's reasonable and what's going to give you performance issues. (Or rather, once you have performance issues, having some idea where to look.)
I have a CS background and my bias is that you should consider taking a fundamentals class (on Coursera or the like, since you seem to be self-motivated) on algorithms and data structures. I can't recommend a specific one, but there'll be oodles of info out there on which ones are good and which use a programming language you know or want to learn. You could also do this by working through the book Structure and Implementation of Computer Programs which is available on the web and is a classic. (There seem to be multiple web versions?)
If they had taken a different wrong turn, they might become lisp hackers. Quelle horreur!
Try working through this https://www.amazon.com/dp/0262510871
Effectively you have learned a little bit about hammers and are asking "is this it? is this all it takes to build a house?"
Although you can read SICP and NKS online, they look good on a bookshelf.
> For example, how would I know if I should design something as an object or function? What should I run as separate threads, and how do I figure these things out on my own?
These questions, and some more like these, don't have exactly right answers, even though there can be extremely wrong ones. In reality, what you find is that there are reasonable answers to these questions and they usually depend on context.
Having practice projects help. Build your own stuff. However, just going around doing your own things without looking at what others did isn't that smart. Reading other people's code is an interesting idea. Some books are also helpful here, but don't expect miracles. SICP (https://www.amazon.com/Structure-Interpretation-Computer-Programs-Engineering/dp/0262510871/) really helped me with some of the issues I believe you're having. Maybe you can benefit from reading the gang of four design patterns book (https://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612/). There are books about design and implementation of particular systems. For example:
There are more, of course, and some of these are not so great (although still helpful and, usually, much better than what you'd find in "random blog posts in the web").
In general, I believe one of the best way to learn about what you want to learn is to go look at what others did. How did people solve the problems they had in building software system X? Start filling in for X and doing your own research. X could be linux, windows, google chrome, google search software, google translator, adobe photoshop, matlab, R, Eclipse, and so forth. You may not find much for some X, but you'll actually find a bunch of stuff about for several very interesting X.
Another tip here is to pick a problem domain and see what problems people are trying to solve there. I mean, leave "general programming" and start looking at more specific stuff like numerical methods, image processing, AI, game development, bioinformatics, embedded computing, computational statistics, simulations, etc. Find one or two of these subjects that are of interest to you, follow some important people in the field, see what is going on there. You'll find that "design methods" and also "resource usa optimization methods" can vary drastically from field to field, for very good reasons. There are some subcategories in these, by the way. For example, 2d versus 3d game development; single player versus multiplayer (multiplayer can be online or not), etc. In AI there are the deep learning people, the rule based systems people, etc. Numerical methods is huge. There are tons of these. Although you can learn quite a lot on the "general programming techniques" side, there is only so much there. A lot of the interesting things is context specific.
That makes sense, I guess I am slightly despairing because it is such a huge project and I am a sole developer and because of how much it is all tied together it takes a full day to just add a simple button, and to add all the changes all through the code base
​
Thanks for the a) reassurance and b) the recommendation
​
When you say SICP do you mean this book? https://www.amazon.com/Structure-Interpretation-Computer-Programs-Engineering/dp/0262510871/ref=asc_df_0262510871/
On the internet I'm seeing an unofficial textbook version that is free, while on Amazon they sell the original. Are they the same book or should I grab one in particular?
Buy this book and read them a chapter every night as a bedtime story. It has wizards and suchlike so is very workable for children.
Learning trigonometry, Java, Japanese cooking (already got miso soup nailed), and reading SCIP.
Side projects to include: cleaning/fixing my old logitech g15 keyboard, re-hooking up the watercooling system on the computer as the new place is super dusty so the less fans the better, change the oil in the motorcycle and start collecting the things needed for the 10,000 mile tune-up, various maintenance work that needs done on the car, scanning books from my library-in-boxes (can't afford shelves or even the wood to build them) into GoodReads (241 done so far), and a variety of side-side-projects involved in keeping a 1934's house from collapsing inward on itself in a wormhole into another dimension of doom. All with the barest amount of money possible.
And yard work, always yard work.
Structure and Interpretation of Computer Programs. It's one of the most famous CS books. ;)
The internet is rather comprehensive resource. You could read up on aspects of cs (and potentially/likely mathematics since if you want to be useful you gotta go deep) and put them into practice. There are many awesome guides, and stack exchange is a wonder.
​
Some things to keep in mind (please account for bias):
http://www.catb.org/esr/faqs/smart-questions.html
https://www.crummy.com/software/BeautifulSoup/
https://www.crummy.com/software/BeautifulSoup/bs4/doc/#searching-the-tree (etc.)
http://www.ciscopress.com/articles/article.asp?p=24090&seqNum=4
https://www.charvolant.org/doug/network/html/node9.html
https://docs.oracle.com/javase/8/docs/api/
https://docs.oracle.com/javase/10/
http://www.gigamonkeys.com/book/
https://tiswww.case.edu/php/chet/bash/bashref.html
https://www.goodreads.com/list/show/126167.Humble_Book_Bundle_Linux_Geek
https://www.tutorialspoint.com/cprogramming/c_useful_resources.htm
https://www.oreilly.com/library/view/unix-and-linux/9780132117364/
https://www.amazon.com/gp/product/0262510871/ref=ox_sc_saved_title_7?smid=ATVPDKIKX0DER&psc=1
https://www.amazon.com/gp/product/184890066X/ref=ox_sc_saved_title_1?smid=ATVPDKIKX0DER&psc=1
https://medium.freecodecamp.org/a-thorough-introduction-to-distributed-systems-3b91562c9b3c
http://www.ciscopress.com/articles/article.asp?p=24090&seqNum=4
http://cnp3book.info.ucl.ac.be/principles/linkstate.html
https://docs.oracle.com/cd/B19306_01/server.102/b14200/toc.htm
https://docs.oracle.com/cd/B19306_01/server.102/b14200/functions231.htm
https://doc.lagout.org/security/Hackers%20Delight.pdf
https://null-byte.wonderhowto.com/
https://www.webopedia.com/quick_ref/OSI_Layers.asp
Dubious: http://www.catb.org/jargon/html/go01.html
​
Older, mostly relevant (Unix is highly customizable and there are many flavors, but from what I understand the core commands (which are both programs *and* files--everything is a file in *nix and BSD systems--don't change much):
http://index-of.es/Programming/Misc/OReilly.Mac.OS%20X%20For%20UNIX%20Geeks.pdf
http://student.ing-steen.se/unix/ungk/Unix%20Power%20Tools%20(3rd%20Edition).pdf
​
(Check out Electrical engineering stack exchange
Also:https://pcpartpicker.com/b/3H7WGX?comment_sort=oldest
You're gonna want to build a pc at some point.)
​
Also, cheers. More people should be asking questions like this.
I'm learning more from internet searches than I did at college. There aren't many worthwhile connections made there.
In my experience college is mostly viewed as a haven for pleasure seekers instead of people who want to learn.
The degree is a form of status symbol, but usually it's practically worthless.
You can get the skills you need and plot your career without college's rigorous social selection that gives you a lot of bad habits and maybe some complexes.
​
Here's Your University. You'll learn more here than in class. Plus, it's usually the case that one gets too much attention at college:
​
Plus there are so many free (and relevant) resources (like books and manuals) online.
(Another lovely college tidbit is that if you don't plan your funding effectively and take government loans you will find the rewards for your labor significantly reduced when it matters--which I avoided, but still.)
​
Plus these works are supported by an awesome community.