This is a letter to my old self about what I would of changed in how I did my Computer Science degree. The main reason why I didn’t do well was because I wanted to just start working as a programmer and I was driving with the parking brake on as result. If I grew up in California instead of Canada, I might of taken that path.

Hopefully if you are in a similar position, you will find this useful. Also read what I wish I learned about math and infinity for your college math classes.

Get Your Degree Done Quickly If You Are Going to Get a Degree

If you commit to do doing a degree, just get it done. Don’t whaff around because you do not enjoy it on some level, life is short, even though it doesn’t feel that way when you are 20. Try to finish in 4 years with 2 or 3 internships during summer months instead of about 5 years + 1 year of working in internships in between for a total of 6 years.  I would say 3 years, but that workload would have been unsustainable for me personally.

But also come prepared with the knowledge that you can actually work in a well paid job in silicon valley and you wouldn’t just get a local job in Canada for accountant wages. But you need that degree to get the work visa to work there in the first place, which would of been a great motivator to do your degree, since you just wanted to go do programming jobs directly as a self taught programmer.

Take a Lot of Algorithms Classes

Instead of loathing your algorithms class, you should deep dive into it and make sure you did it really well instead, since it’s the linchpin of most silicon valley interviews.  Because of the way your memory works, if you deep dive into things, you really tend to remember it for decades. You should take the extra elective algorithms classes to get really good at it.  It would’ve been the most high value part of my university education as far as your future career would have been.

I would also use interview practice websites & books like https://www.interviewcake.com (if they existed back then) in addition to my actual textbooks to learn a bunch of algorithms class materials. If your algorithms textbook was as bad as a typical calculus textbook, I would suggest seeking out alternative resources.

Math Classes Are Literally Double The Workload

Treat you math classes as double classes and take one less class in a semester that your taking them to give them proper focus.  Their workloads were literally double and math teachers & materials are usually not as good as other classes.

If some principle presented to you in math class seems like hand wavy bullshit and thus was hard for you to accept, I would have went to office hours and drilled my teacher about it vs. try to just figure it out on my own. Ignore the hacker culture ‘try to figure it out yourself before bothering others’ cultural rule in this case. You are literally paying these people to teach you, and math land doesn’t have nearly as much writing explaining things on the internet as CS and software land does.

Realize that the quality of instructor really matters for math classes. Go to the local community college with far better math instructors, but not as good CS instructors, and shop around for the best math college classes. Not the easiest classes, but the one with the best education. At your school this might be inverted, but I suggest this especially for math classes.

Many math textbooks are useless to read and should only be treated as problem set repositories.

Do Your College Degree Normally, Don’t Get Inspired by Hacks

Do your college degree normally and not get inspired by blog articles like Steve Pavlina’s where he did his entire degree in 3 semesters with a lot of college curriculum hacking, monomaniacal focus, triage and maybe secret adderall usage for all I know.  Show up to every class at the very least, actually focus at the class vs. do homework in the class because a blog article sold it. Also avoid morning classes, you are a night owl.

Internships Are important

I did co-op / internships, but if you are doing a degree, this is one of the most valuable parts of it!   The college system and corporations have a pipeline to help you get your first work experience that solves the chicken and egg problem of needing work experience to get a job, and a special interview process that is usually significantly easier.  Also try to work at different companies vs the same one, since each one has a unique work culture that can teach your different things about what you like.

What Actually Matters to Employers

Most employers don’t care about software engineering or other variations of degrees, it’s all the same to them.  Don’t necessarily go for the more workload heavy or less flexible ‘software engineering’ degree because it seems more prestigious or more of an accomplishment than the computer science degree.  Employers care about:

  • Can you pass the leetcode / algorithms part of your interviews (the algorithms classes)
  • Can you demonstrate that you can program and have a good understanding of the platform for the role we are hiring for. Which means you understand things like:
    • Strong typing (projects in strongly typed languages)
    • Databases (databases class)
    • How operating systems work (OS class)
    • How the computer works (ASM & computer hardware class)
    • How basic http style networking works (The networking class)
    • Doing actual programming projects (hackathons and longer term ones) can help a lot in these demonstrations in interviews.
    • Can you make a basic product in 2 hours for the platform we are hiring for, ex: a todo app for web front end, a todo app API back end server, with persistence, a todo mobile app, etc.
  • Can you make software well and quickly?
  • Are you not an asshole / relatable person
  • Do you have work experience?
  • Can you write?  Although many engineers are bad at writing and it’s not interviewed for, you actually write a lot in software engineering jobs.  You write such things like documentation, emails, design docs & proposals, blog articles, slack messages, etc.  It doesn’t mean you have to be good at formal writing, just any sort of semi-casual communication / writing.
    • Also the 3 point essay with the thesis statement requirement is a restraining straight jacket, and you are right to think it’s a bullshit formal writing thing that nobody uses.

Which means, get a great understanding of algorithms for yourself, and actually program with personal side projects, or better yet, paid jobs via internships. Also write a few blog articles.

What I Wish I Could Told My College Self about Math

I had a good time in HS math, not in college math, some reasons why:

Things That Are Hard to Correspond to Reality Start Becoming Important in College Math

College had some concepts, such as the limit in calculus, that was hard to think of with concrete reality or equivalent operations that could approximate them.  It seemed a bit beyond belief, because I couldn’t build it up from concrete finite axiomatic principles and then go up from there, so I had a hard time wrapping my head on it.   Also calculus said “take this to infinity” which seemed impossible in physical reality, so I felt like therefore the principle had to be unsound also, or at the very least something I couldn’t understand myself.

If I can’t understand the fundamentals of something, I usually have a hard time hand waving over it, since a lot of my understanding of something comes from building up from the first principles of something and recreating the more advanced concept in my head from the more basic concepts vs. doing rote memorization.  As a kid and today, I loathed anything involving rote memorization and did poorly in it if something required it, much preferring understanding of principles that I could build up with other principles.  So when doing the other parts of calculus, I kept on getting tripped up on how the limit seemed like handwavy bullshit, so the derivative seemed like handwavy bullshit and so on, which internally really increased my resistance towards learning the material.

When I brought it up this issue to my math teachers, they told me the real explanations comes in a really hard 3rd or 4th year analysis class, but because all the other degrees need calculus to teach their science & engineering classes, they couldn’t start with a first principles kind of curriculum, which deeps dives into proofs, sets, the concept of mathematical infinity, etc first to teach it properly and they’re not going to offer it.

Similarly, the entire concept of proof by induction seemed like more hand-wavy bullshit involving infinity (how do you know the principle holds at iteration 34934^393).  It took me a while after college to actually become ok with the entire principle.

Non-finite Math Happens in K-12 Math Too, but It’s Not the Linchpin Usually

You kind of hit up against unbelievable things in grade school math, with things like the square root, or numbers that never end if you repeated the division algorithm (like with 1/3), but I think those were easier to accept because their inverse operations were easy to do mechanistically (like with square root) and you could make concrete examples of it, and something like pi and trigonometry was presented as an scientific property of the reality of circles, discovered through a scientific process, kind of like how the color red is a specific frequency of light.

I do realize now that sin, cos, tan & pi and some of square roots are stuff I just accepted when I was in elementary school although.  I do remember thinking the Pythagoras theorem seemed a bit unbelievable, until I verified it by using it 20-50 different ways on various triangles, and irrational numbers that went on forever were a bit weird.  I think the reason why I accepted it although was because trig was only a small part of my grade school math education, while most of it was some form of arithmetic, algebra or something derived from algebra, which again, was expressible in concrete reality with mostly integers.  Also beyond the magical functions of sin, cos and tan, you could apply a lot of techniques using them and they were not analytically one way functions sometimes, like logarithms could be.

I first ran into my ‘what is this unbelievable handwavy bullshit’ feeling with the logarithm in high school math.  A hint of what was to come.  To me the logarithm seemed somewhat magical and incomputable from basic alegbraic principles unlike pretty much everything else. Same with the ‘natural’ number e, that seemed to come out of nowhere, and wasn’t even relatable to something concrete like a circle like Pi was. Logarithms of whole numbers almost always resulted in hard to reason about irrational numbers and they never taught you how to calculate a logarithm by hand other than some very contrived examples that mostly involved deriving them from their inverse.  Ex: log_2(4) is 2 because 2^2 = 4.

So overall you see a general problem of needing to be able to translate mathematics into concrete finite reality.  I’ve realized recently although that is somewhat of a crutch, and you should learn to disconnect that dependency in my article about what I wish I learned about math and infinity.

There Can Be Gaps in Your Math Education

Something I’ve noticed recently is how people are not taught what the basic derived principles of math are and the gaps in peoples knowledge.  Like there is a good segment of the population that don’t realize that division is a form of repeated subtraction, like multiplication is repeated addition.  Is it because of the much maligned common core, or is it because they kind of glazed over the long division section of their elementary math education?  Who knows? The pieces of arithmetic might help you if you didn’t know long division is a form of repeated subtraction.

Numerical Approximations Can Help Understanding

Very recently I’ve realized you can crudely approximate the numerical results of what a logarithm is by repeatedly dividing it until you hit a result that is less than one, which seems obvious in hindsight, because an exponent is repeated multiplication, and the inverse of multiplication is division, which is like a logarithm, but this is never taught anywhere.

Ex: with log_2(42) = 5.392… you divide 42 by 2 6 times until you hit a result which is less than 1 which tells you the number is in between 5 and 6.

  1. 42/2 = 21
  2. 21/2 = 10.5
  3. 10.5/2 = 5.25
  4. 5.25/2 = 2.625
  5. 2.625/2 = 1.3125
  6. 1.3125/2 = 0.65625 Done, it’s between 5 & 6

Now I’ve realized this, logarithms feel a lot less hand wavy and more realistic, even though my numerical approximation method is pretty useless.

Even when you search for how manually calculate logarithms, a bunch of answers are not that useful on math stack overflow, which shows a gap in traditional instruction about logarithms.  Most use the limited symbolic methods to calculate it.

So, try to figure out how to numerically approximate something you are having a hard time understanding, even if the curriculum doesn’t teach you how and it isn’t very useful.  It can help you translate how the pure mathematical model would apply to reality if you tried to use it, which can help further cement your understanding in something.

If I realized all of the above before doing college mathematics classes, along with my what I wish I learned about math and infinity article, I would have had an easier time. I would have accepted the principles as independent abstract systems that are used to model reality, so if they state physically impossible things like take the limit to infinity, it’s ok if they don’t actually match reality.  Also that infinity is not a specific number, but a description of a process that keeps on going forever.