Also I consider myself a young bright mind. I would love to learn any computer science topic you would want to teach.
There is a huge lack of online advanced computer programming/science recourses. Why don’t you try your hand at creating some. It takes time and effort but instead of just reaching 300 students a year you can reach tens of thousands.
If you're like me then two resources I can't recommend highly enough are Structure and Interpretation of Computer Programs and Tim Roughgarden's Algorithms courses. Both made me a much better programmer in ways that are difficult to describe.
Ah, if you've already tried it and hate it then maybe it isn't for you. It felt very natural to me. Don't worry, plenty of good programmers hate LISP and indeed functional programming.
Lisp to me is antithetical to the entire idea of programming languages. The entire point of programming languages is to make AST construction human writable and readable. As well as improve tooling and error messages.
This is accomplished by differentiating. If statements look different then variable declaration both to you and to your tools. This is a good thing.
While lisp is like. let’s write ASTs. I’m very much not convinced LISP can ever get real error messages.
I also have huge bones to pick with functional programming people despite finding the discipline really cool. I’m even in the middle of writing a long explanation of why OOP is awesome. Here’s a very very early draft. https://shlomoalon.github.io/OOP-Dialogue/what-is-oop.html. I have later ones but I still haven’t figured out how to automate the GitHub pages deployment.
Here’s my definition of object.
An object is a user created primitive-type that is so well-defined that it is as if you added another primitive type to the standard library**. Just as you rely on the List, String, Set, and Dictionary types to be rock solid. To never create an invalid state. To never create a breaking change in user land. So too an object is a user-created type that you can rely on to be rock solid. To never create an invalid state. To never create a breaking change in user land.
You just have to play with all the different styles and see which ones fit your mind best and which ones fit your problems best. Objects are Closures are Dictionaries. Sometimes mutable state is the best way to do something, sometimes it's a trap you don't need. Different languages make different choices about which ways of doing things are most useful.
What SICP is all about is building everything up from a few primitives so that you can see what's really going on. Then you don't mistake the choices a particular language has made for anything fundamental.
You're right about LISP being 'write the AST'. The reason for that is that SICP is going to make you write the definition of your language in that same language, and having to parse it makes that much harder to do.
The surprise is that some weirdos like me find that they prefer to write the AST directly.
I'm always torn between python and clojure for hobby projects. As far as capabilities go they feel very similar.
I know that python will have better libraries and be easier for other people to read, but I also know that I'll enjoy writing the program more, and the finished program will be better, in clojure.
I’m actually thinking of writing the anti lisp language. Which also allows you to write the AST. but you do it as a tree instead of as a soup of parentheses.
I will definitely give it a shot. I’m gonna see if I can borrow it from the library on Monday. In my mind as long as I’m not typing the parentheses soup I can read it.
I’ll give SICP another shot. I’m a computer science student though I have lots of experience with algorithms.
What I’m really interested in is the stuff that you’ve learned over the years. I feel like every programmer becomes an expert in many random stuff. So much of it is lost because people refuse to document stuff or record themselves.
For example I found a really cool functional data structure. But the codebase has zero documentation. I really wish I could speak to the writer and slowly make my way through the codebase and learn the intricacies of it. Sadly it’s way beyond my ability right now.
Every open source code base feels like a treasure trove of knowledge if only I were to have a guide capable of pointing me in the right direction.
Most of what people know is very contingent! I could tell you endless anecdotes about pager development or the idiosyncracies of 20th century microcontrollers, but none of them will ever be relevant to your life.
Particular bits of knowledge quickly become irrelevant. Most of the treasure trove of knowledge in open-source codebases is really really specific to the problem they're dealing with and the particular problems they ran into, the language and the libraries that they used.
The timeless underlying principles and the ability to look at a piece of code and work out what it does and where the bugs are what you need. Or alternatively the ability to take an idea and explain it to yourself so clearly that you can then explain it to a diligent idiot. The ability to reason, in fact.
That's what a compsci course should be trying to teach you, but I'm not sure we know how to teach it. As a general rule if you're not feeling challenged and enthralled, you're not learning anything worth learning.
I guess I'm not actually learning anything this semester :( . Last semester I learned about OS's and building databases. Both really cool. This semester I took a compilers course and a webdev course and it's a lot of drudgery.
Stay as abstract as you can. Stay rigorous. There are plenty of people who will pay you very well to learn all the little details of whatever they've chosen to use. What they're looking for is the ability to see how to do the abstract stuff in whatever language and system.
When I hear of undergraduates being taught how to use git, or java, or God forbid jenkins I roll my eyes....
Also I consider myself a young bright mind. I would love to learn any computer science topic you would want to teach.
There is a huge lack of online advanced computer programming/science recourses. Why don’t you try your hand at creating some. It takes time and effort but instead of just reaching 300 students a year you can reach tens of thousands.
If you're like me then two resources I can't recommend highly enough are Structure and Interpretation of Computer Programs and Tim Roughgarden's Algorithms courses. Both made me a much better programmer in ways that are difficult to describe.
I also hate LISP with a passion and the idea of working through an entire book made of lisp seems like a nightmare.
Ah, if you've already tried it and hate it then maybe it isn't for you. It felt very natural to me. Don't worry, plenty of good programmers hate LISP and indeed functional programming.
Lisp to me is antithetical to the entire idea of programming languages. The entire point of programming languages is to make AST construction human writable and readable. As well as improve tooling and error messages.
This is accomplished by differentiating. If statements look different then variable declaration both to you and to your tools. This is a good thing.
While lisp is like. let’s write ASTs. I’m very much not convinced LISP can ever get real error messages.
I also have huge bones to pick with functional programming people despite finding the discipline really cool. I’m even in the middle of writing a long explanation of why OOP is awesome. Here’s a very very early draft. https://shlomoalon.github.io/OOP-Dialogue/what-is-oop.html. I have later ones but I still haven’t figured out how to automate the GitHub pages deployment.
Here’s my definition of object.
An object is a user created primitive-type that is so well-defined that it is as if you added another primitive type to the standard library**. Just as you rely on the List, String, Set, and Dictionary types to be rock solid. To never create an invalid state. To never create a breaking change in user land. So too an object is a user-created type that you can rely on to be rock solid. To never create an invalid state. To never create a breaking change in user land.
You just have to play with all the different styles and see which ones fit your mind best and which ones fit your problems best. Objects are Closures are Dictionaries. Sometimes mutable state is the best way to do something, sometimes it's a trap you don't need. Different languages make different choices about which ways of doing things are most useful.
What SICP is all about is building everything up from a few primitives so that you can see what's really going on. Then you don't mistake the choices a particular language has made for anything fundamental.
You're right about LISP being 'write the AST'. The reason for that is that SICP is going to make you write the definition of your language in that same language, and having to parse it makes that much harder to do.
The surprise is that some weirdos like me find that they prefer to write the AST directly.
I'm always torn between python and clojure for hobby projects. As far as capabilities go they feel very similar.
I know that python will have better libraries and be easier for other people to read, but I also know that I'll enjoy writing the program more, and the finished program will be better, in clojure.
I’m actually thinking of writing the anti lisp language. Which also allows you to write the AST. but you do it as a tree instead of as a soup of parentheses.
I will definitely give it a shot. I’m gonna see if I can borrow it from the library on Monday. In my mind as long as I’m not typing the parentheses soup I can read it.
You might check out Peter Norvig instead then. A classic Lisper who writes most of his educational examples these days in Python.
I’ll give SICP another shot. I’m a computer science student though I have lots of experience with algorithms.
What I’m really interested in is the stuff that you’ve learned over the years. I feel like every programmer becomes an expert in many random stuff. So much of it is lost because people refuse to document stuff or record themselves.
For example I found a really cool functional data structure. But the codebase has zero documentation. I really wish I could speak to the writer and slowly make my way through the codebase and learn the intricacies of it. Sadly it’s way beyond my ability right now.
Every open source code base feels like a treasure trove of knowledge if only I were to have a guide capable of pointing me in the right direction.
Most of what people know is very contingent! I could tell you endless anecdotes about pager development or the idiosyncracies of 20th century microcontrollers, but none of them will ever be relevant to your life.
Particular bits of knowledge quickly become irrelevant. Most of the treasure trove of knowledge in open-source codebases is really really specific to the problem they're dealing with and the particular problems they ran into, the language and the libraries that they used.
The timeless underlying principles and the ability to look at a piece of code and work out what it does and where the bugs are what you need. Or alternatively the ability to take an idea and explain it to yourself so clearly that you can then explain it to a diligent idiot. The ability to reason, in fact.
That's what a compsci course should be trying to teach you, but I'm not sure we know how to teach it. As a general rule if you're not feeling challenged and enthralled, you're not learning anything worth learning.
I guess I'm not actually learning anything this semester :( . Last semester I learned about OS's and building databases. Both really cool. This semester I took a compilers course and a webdev course and it's a lot of drudgery.
It’s never too late. Plenty of people go back and do their phds.
Just go work at a prestige company for a year or two and they will be dying for you to do your PhD.
There are also teaching professors where you aren’t required to do research.
> It’s never too late. Plenty of people go back and do their phds.
The very thought gives me the shivers! A dreadful experience and I never want to do anything like it ever again.
Ya school sucks so bad. Though there are schools with less rigorous programs.
Stay as abstract as you can. Stay rigorous. There are plenty of people who will pay you very well to learn all the little details of whatever they've chosen to use. What they're looking for is the ability to see how to do the abstract stuff in whatever language and system.
When I hear of undergraduates being taught how to use git, or java, or God forbid jenkins I roll my eyes....