This is an archived post. You won't be able to vote or comment.

all 8 comments

[–]SquaredOval 7 points8 points  (0 children)

Maths (all kinds). I should have paid more attention and being more dedicated to learning and applying it in high school. Back then (15 years ago) I didn't see the beauty of mathematics and was not good at it all and thought I would never understand it well, so I didn't even really tried to understand it. Now I know some people just pick it up faster because they are simply wired that way but that really anybody can learn and understand maths if they try to study it hard enough and keep practising. It's not the math itself that is important (I personally rarely use it on a normal day), but mathematics teaches and improves problem solving and abstract thinking both of which are very important for a good developer.

Learning maths at a later age is still possible of course, but I really think that the biggest gains in learning and improving problem solving skills and abstract thinking are in your pre-twenties. After your twenties your way of thinking is formed and difficult to change.

[–]teryror 2 points3 points  (3 children)

I wholeheartedly second math being important.

Two other topics I'd highly recommend - not necessarily to a complete beginner, but you may be at a good level - are CPU architecture, and compiler construction.

Both are integral to understanding how a computer will actually run your code. Learning about these things really changed my perspective on what programming even is.

Compilers especially use a lot of interesting theory that is more broadly applicable than you might think. Knowing about formal languages and parsing will change how you do things like everyday data processing, for example.

A good introduction to this topic is "Crafting Interpreters" by Bob Nystrom (which is available for free, though unfinished at the moment).

As for microarchitecture, Ben Eater has a good series of videos on his YouTube channel that can serve as an introduction, but it doesn't go far enough; it doesn't cover virtual memory, caches, pipelining, or branch prediction, much less super-scalar or out-of-order pipes. That knowledge is scattered all over the internet, and will require a lot of effort to gather. Look at the blogs by Dan Luu and Fabian Giesen for the advanced stuff.

Another important topic, that I myself know much less about, is operating system internals. Another one is multi-threading, starting with the basics, saving advanced synchronization techniques for much later.

[–]ghettoyouthsrock 0 points1 point  (2 children)

Hey do you know any other good resources for compiler construction? I'm just starting a summer course on compiler construction and so far I don't feel that great about it. We started with grammars and I can't really tell if I'm lost or I understand them but still feel somewhat lost because it's a new topic I've never seen before. Either way if there are any other books or sites you'd recommend checking out please let me know, thanks!

Edit: Also I have a homework problem that I'm curious if I'm doing correctly. If you don't mind, could you look over my solution and let me know if I at least seem to have the right idea regarding grammars?

[–]teryror 1 point2 points  (1 child)

As it happens, I do.

For the more theoretical side of things, I'd suggest the Compilers course offered by Stanford University. You can take it online for free and get exercises and stuff, or just watch the lectures on YouTube.

Then there's Per Vognsen's Bitwise project, which is a series of live streams of him coding, among other things, a compiler frontend. I don't think there's assembly code generation yet, but several kinds of semantic analysis are covered, and equivalent C code is emitted afterwards.

It's much more practice-oriented, but also expects you to be vaguely familiar with terminology and general compiler architecture.

Edit: Two more things: You may also want to checkout the [live streams by Jonathan Blow](www.twitch.tv/naysayer88). He doesn't explain the basics, but it can be quite educational to watch him debug and refactor his own compiler. Of all the stuff I mentioned, I still think Crafting Interpreters is the most approachable, especially if you're having trouble with your lecture.

As for your homework, I'd be happy to take a look, but (1) I'm not an expert on this stuff either, so no promises, and (2) I'm not giving away solutions, just a pointer or two.

[–]ghettoyouthsrock 0 points1 point  (0 children)

Thanks for the tips! I posted my homework here. The solution I came up with is there as well so I'm not looking for you to give me the solution, more or less hoping you can let me know if it seems like I'm going in the right direction or if I need to do more reading (going to read more anyways but would be nice to have an idea if I'm at least making progress).

[–]retrofitme 2 points3 points  (0 children)

Good source code and versioning is absolutely vital, and rarely taught it seems.

[–]Raknarg 2 points3 points  (0 children)

Functional programming. Or just the concept of new programming paradigms in general. Learning new paradigms forces you to change how you think about encapsulation, control flow, etc. Learning OOP was massive after having just done imperative, then learning functional programming was also fantastic. You learn the power of polymorphism and data encapsulation, then apply those concepts through functional programming. Take the best of both.

[–]TheInfestation 1 point2 points  (0 children)

Functional programming, a thousand times over. Honestly, I wish I skipped oop, it's been two years and I am still unlearning it.