Having somewhat recently finished my undergrad and MEng, I wanted to take some time to reflect on my educational experience so far. I’ve only experienced a small slice of the potential pathways in the US education system. I will try to generalize, but who knows how that will go.
This is a collection of things I would say to my younger self, advice I have given to people before, and things I just feel like should be said. It will almost entirely focus on academic advice. Sorry, but I didn’t feel like taking the time to make this short.
I don’t know if this is a big thing in other fields, but it’s definitely pretty big in CS. A good chunk of people come in with a little experience in coding and some CS related topics. This might be because the field is so young that the days when this was practically the only way to learn it is still in living memory. But the corpus of CS knowledge has grown exponentially since then. Take another field, say physics. What Newton was able to discover on his own in his lifetime was extraordinary, yet it pales in comparison to what someone can learn through a few physics classes today.
Now not to brag, XD, but I think I had the most rigorous self-taught CS “education” out of everyone I met. I spent countless hours programming and making things (mostly games), but I also tried studying computer architecture, software design, algorithms, the intricacies of the programming languages I used, and a few other topics at an undergrad level. When I’d go on college tours in highschool, I’d even take a look in the school book stores and try to get a CS textbook or two I found interesting. Admittedly, I was a bit arrogant my first semester, but during the second semester I wised up.
Here’s the thing with self-teaching. You don’t know what you don’t know. If you misunderstand something, there’s nothing to correct that. If you struggle with something, there’s no one to help you. There have been various topics I “taught myself” so poorly that when I learned them in college, I thought I was learning it for the first time. Others yet where I question how in the world I ever thought it made sense when I didn’t even know some foundational thing even existed. Overall though, for most things I “taught myself”, I was able to pick up some central ideas, but I truly only had the faintest idea of the topic and didn’t realize it.
Then of course there’s the countless other topics I didn’t even know existed. How can one teach yourself something if you don’t know what you should be teaching yourself? In some cases, this would be like not knowing about a whole area of study, but the more dangerous case would be missing something foundational that puts everything else you “learn” on shaky ground. My example of this is discrete math. Not really required, per se, but it gives you a way of thinking and reasoning about code that I found to be invaluable. It also makes the discussions on a lot of other topics, such as algorithms, make more sense. It’s not too bad to learn algorithms that already exist without any mathematical background, but it gets more challenging to devise new algorithms and convince yourself (and others) that they work without the method of thinking taught in proof-based math.
The one major advantage self-teaching did have is that since I had experience doing things “the wrong way”, and knowing how painful it can be, I had respect for my professors’ wisdom that seemingly exceeded my peers’. This is especially true for matters of software engineering where I just ate up ideas like loop invariants and test-driven development, easily recalling times in my past where knowing about them would’ve saved me hours of work.
So I guess to summarize this:
US schools typically have general requirements (GenEds) that all students have to take. They oftentimes seem to have nothing to do with their area of study. This is in both college and highschool. For example, in college I had to take first-year writing seminars, physics, chemistry, and a few liberal studies classes. I’m going to ignore the “obvious” argument that basically goes something like “why should we expect a teenager to know exactly what they’re going to do with their life, general requirements force exposure to different areas students might learn to love. People often change major and career paths, giving students options is extremely valuable, as is students discovering things they truly dislike. Should a student only be learning to work, or should they also be learning to live?”
So let’s take the case of someone who is really confident in their future plan. First of all, there’s the whole finding new interests argument. I discovered in highschool that I enjoy history (as with just learning in general), which is an interest of mine to this day. I also took a class on the US healthcare system in college which has made choosing healthcare plans for work and knowing the terminology used in the industry so much simpler, along with giving me more background to vote on healthcare policies. This is also that whole learning to work or learning to live argument.
But quite honestly, the biggest thing for me was finding connections between different subjects that strengthened my appreciation and understanding for the CS ones I deeply cared about. The focus on clear and concise arguments in my writing seminar easily found connections with the same goal in my proof-based math class. And since my intro to proofs maths class was a CS focused one, we constantly used phrases like “type checking” or “debugging” proofs which made it easy to see the connection between proofs and programming. (They can be seen as quite literally the same thing , but that’s a story for a different day).
I really don’t believe that any class is “useless”. For example, I took an intro psych course as a liberal studies requirement. Beyond being interesting, one extremely useful thing to learn about was human cognitive biases to try and be vigilant for falling for them. Now for someone majoring in psychology, they’d say of course psych isn’t useless, but I think it’s pretty easy for someone majoring in some seemingly unrelated field to say “I don’t see how this applies to my job.” To which I’d say, well how would you know if you didn’t take it? Going back to the psychology example, the first application (albeit indirectly) that comes to mind is my stronger appreciation for the importance of good sleep. One could argue that this helped me perform better on exams and interviews, which got me a job. And knowing about what happens when we sleep continually drives me to ensure I don’t skimp out on it, which could help in performing better in my career.
So to summarize:
You know how your math teachers have always been trying to get you to “show your work.” And sometimes it’s just like, “I’m literally adding small numbers, what more do you want from me?” I’ll admit sometimes it was a bit overbearing, especially in elementary school.
But once one gets to math in college, the whole point is showing your work, since the work (proof) is how you convince yourself and others that your statement is in fact true. “Can this computation used in autopilot software fail to terminate?” There’s only two choices here, yes, or no. It would be preposterous to say “No, because it makes perfect sense to me.” The families of dead passengers are not going to be satisfied with “I did it in my head.”
But of course, how exactly does a teacher quickly convey that they’re preparing students for a potential STEM career in a way that students would accept? What about students who aren’t currently planning on a STEM career? Are they going to accept the vague but true, “many people discover another field that interests them more” argument? Most teachers I had used the “so I can give you partial credit if you make a mistake” card, which was good enough for me.
Now let’s fast forward a bit. In a programming class I took, we had to read a really popular software engineering book called The Pragmatic Programmer. This book is filled with anecdotes and advice for software engineers, and I loved it. For class, lots of people just skimmed the book, and when it came to assignments where the professor had us trying out suggestions from the book, Test-Driven Development (TDD) in particular comes to mind, many people gave a half-hearted attempt just to get the credit for it. But I had worked on “bigger” projects than what most other students had touched at the time, and I immediately recalled experiences where using this technique would’ve saved me an immeasurable amount of time.
Actually, in another class I took later, I was working on a project that was easy to apply the TDD approach to. Our professor even recommended it. My partner and I followed his suggestion while a group of my friends didn’t. One team seemed to consistently have less problems with the submitted labs than the other. I’ll let you guess which one that was…
To this day, The Pragmatic Programmer is sitting on the bookshelf right besides my desk.
To recap:
As a highschool student, I was quite concerned with getting into a “good” school. Too concerned if you ask me now. And it’s not like I had pressure from my parents, I think it was just something almost everybody (including me) assumed.
So what is your definition of “a good school”? If you’re like highschool me, it mostly comes down to what some random organization on the internet and the collective psyche says. But what you should be weighing much more heavily are things like “am I going to like it here?”, “would it be easy to enjoy my hobbies with other students?”, and “what is the student body like?”
From what I’ve gathered, the core academic experience between different schools is largely the same. At collegiate events, I’ve met many other CS majors from different schools, some of which I’ve never heard of. Academics would frequently come up at some point, and although course content would generally differ a bit, equivalent courses were pretty much… equivalent.
I’ve occasionally used textbooks from other schools, and they basically are all the same. I have also met plenty of people from “less prestigious” schools who get good jobs at top companies upon graduation. So no matter where you go, things will work out fine.
Quick tangent on textbooks. Unless you really want to, you probably don’t need to buy most of your textbooks. First, wait until at least the first day of class. Your professor will probably tell you how “required” the textbook actually is. Second, if a book is truly necessary, you can probably get it free or pretty cheap from someone or somewhere. At least when I was in school, it seemed like the winds were changing towards free online resources for anything mandatory and free online polling services for interactivity instead of clickers. (I never bought an iClicker, and I never had a class that used them.)
Ok, back to “good” schools. So if the academic experience is basically the same then what’s the difference? Having only gone to one school, I can’t really say, but my best guess is that it mostly comes down to staff and accessible opportunities.
Most differences in knowledge between graduates comes down to what classes an individual chose to take as electives and what they chose to focus on. I’ve only met like one person (let’s call them K) who seemed to have not learned something other schools might consider a “core” subject (let’s call it subject X). But plenty of people in my school hated that one course on X and pursued no further instruction in that area. I’m not even sure what K knows about X would be vastly different from what my classmates who hated X know about it when they get to K’s age. It’s very easy to remember things you enjoyed or use often and forget things you didn’t care for and/or don’t use. If you ask me anything about college-level chemistry, chances are I won’t remember.
I suppose requiring a topic like X forces exposure that might lead someone down a path that uses it. One might be able to argue that if later in life K decides to switch fields and go into something where X plays a bigger role, they could have had an easier time if they graduated from a school which forced them to learn about it (assuming K didn’t learn about it and just forget).
Now, it’s possible that some schools don’t have enough people who study something to make that topic mandatory. I will also admit that it’s possible that some schools are faster paced so students have more time for other topics. But I still think an individual’s path has a bigger influence on what they know than the school itself.
As another example, one of my friends took a compilers course while studying abroad. Compilers is a somewhat niche area and is not required; the majority of graduates from my school never take it. From what I heard, his professor focused an inordinate amount of time on things almost all compilers people would consider to be “solved problems” and spent little time on what I think most people today would consider to be more important. I don’t know the professor, but I suspect that their area of study can be applied to a few compiler things, but they’re not really a “compilers person”. I also might suspect that the school didn’t have anyone with interests more aligned with compilers. Learning something from someone who is known in the field is different from learning something from someone who works in an adjacent field. Some schools might not have many people who work in a particular area and this could make the educational experience and available opportunities for that area poorer.
When applying to grad schools, applicants apply to schools with professors whose work interests them. One wouldn’t really care all that much about the school’s reputation, but rather the labs they might want to join. But since most, if not all, undergrad applicants don’t know what specific field they’ll focus on, you are left with the flawed (but not terribly incorrect) logic that a “good” department probably attracts good people, who probably come from different areas in the field. And hopefully at least one of them is interested in something you might find interesting. And that’s assuming you know what subject you want to study. If you don’t (many people don’t either, this is expected), then you have to go one level down and say a “good” school probably has “good” departments, and these departments probably have good professors who probably come from all over the field. And one of these professors probably studies something you might become interested in.
So a “good” school really just rests on a long chain of probabilities. By all accounts, the experience in the core curriculum is basically the same between schools. Things might differ slightly once you start getting towards electives, but it’s impossible to predict which electives you might end up really caring about and which ones you might never take. If you happen to get unlucky and find something interesting that isn’t studied much at the school you attend there’s always grad school. You can also make a similar argument about big schools, so don’t get hung up on “good” schools.
In summary:
I found an old notebook the other day consisting of some of my “SAT words” in highschool. Some of them are words I would expect like “promulgate” or “austere”, but tons of them are what I would consider to be somewhat everyday words such as exacerbate, amicable, abysmal, egregious, or postulate. The list of these goes on and on. I mean, I had to learn them at some point but I would’ve assumed I learned them much earlier in life.
The point I’m trying to make is that as time goes on, we learn and grow, obviously. And in my very limited experience, there is no time when this happens faster than in college. Even if you don’t realize it, you will change so much, learn so much, and develop personally and intellectually so much.
I look back on things I’ve written as a highschool student with embarrassment. Those college essays and that thing I said that one time? Ew. Even things I’ve written just 2 years I look at with some disdain. My future self might think this very post is junk.
Here’s a relevant XKCD.
I should also mention that the learning doesn’t stop once you get out of college. Teaching yourself is far easier when you have a solid base. I don’t know if anyone thinks this, but I thought I’d say it anyway. For CS people, see Pragmatic Programmer #8.
So to summarize:
There’s a lot to say about working effectively as a team. And others have likely said it better than I can. If you’re in an engineering major, you’ll probably have at least one significant team project in every semester for your entire undergrad, so you’ll really get the hang of working with all kinds of people.
I want to address the case where you feel like you’re doing more than your share of the project. First of all, if you feel like you’re doing 2x what a given teammate is doing, then you’re probably all doing an equal share of work since it’s pretty easy to remember your own experiences and time spent.
But even after accounting for this, if you still really feel like you’re doing more work than others, don’t be afraid to start to take on a more active leadership role. This felt awkward to me at first since I feared people would think something like “well who put you in charge”, but in my experience your teammates are probably good people, they just have a bunch of other stuff to deal with and might not care as much about this particular class as you do.
So take the initiative. Maybe setup weekly status updates, organize times where you all commit to working synchronously, divide up tasks and make deadlines, try pair programming, etc. Just be reasonable and aware of the other obligations of your teammates, and they are probably not going to get annoyed at someone trying to help them get a good grade.
This only happened to me once or twice during the early semesters of college, typically in required classes. Being remote due to COVID probably didn’t help either, so maybe this experience isn’t as common as I think it is.
As a corollary to this, I had an opportunity to lead a team for one of the clubs I was apart of. I was initially against it due to the extra time commitment and less time doing the actual programming and problem solving, but it was honestly such a great learning experience.
So to summarize:
For me, office hours didn’t really have a good highschool analogue. In highschool, we had this thing called “extra help” where you would go in early in the morning and, well, get extra help from the teacher. Office hours do serve this purpose, but I would strongly suggest not thinking of them only in this way.
I’ll admit, I don’t think I ever got over the intimidation of going to a professor’s office hours. I don’t know why, I think every instructor I had was really nice, knowledgeable, and wanted students to succeed. Office hours are really a great way to get to know the professor which is just a good networking opportunity. If you go to OH’s that are quiet (a few days before any HW or exam), you can talk about basically whatever: their research, future career options, course suggestions, hobbies, etc. I mean, one of my friends even got relationship advice (this is definitely more of a girl thing than a guy thing, and to my knowledge isn’t a common occurrence). But even if you are strictly talking about course content or getting help on an assignment, that’s what they’re there for and basically everybody does it at some point.
I can confidently tell you that nobody thinks any less of students who go to office hours. It’s perfectly normal to get stuck on a homework problem. Many classes design them to be tough and to look like something you’ve never seen before. That’s how you learn, be well-prepared for the exam (which will probably consist of problems easier than the homework, but still look like something you’ve never seen before), and practice making connections which will help you apply what you learn to problems you might face in the future. This is in contrast to highschool where I think homework was basically just practicing the exact same thing you seen in class.
It’s also perfectly normal to not understand the way the instructor taught something. Sometimes, despite their best intentions, the way they think about something just doesn’t work for you; you’re almost certainly not alone.
Office hours are a great way to meet other students, some of which probably don’t understand the same things you don’t, but also the TAs. When I was a TA, I was more than happy to take questions about non-course related things like choosing classes, internships, interview advice, research, clubs, studying suggestions, etc. I’ve had a few students in which we continued to be friends after the class. I’ve also gone to office hours and ended up meeting other students to work with for the remainder of the class and sometimes future classes.
Some students would “camp” OH, which is basically where they just go to OH for hours, with no particular question in mind but just to work on an assignment or study in an environment where if they get stuck there’s someone (TA or another student) right there to help. I typically only went to office hours with specific questions if I was really stuck and thought about it for at least 24 - 48 hours and a bike ride or two. (I’ve solved so many problems while on a bike ride, even if I’m not actively thinking about them). But that’s mainly because I felt like solving something with no hints from course staff was a bit more rewarding. But I’ll admit camping OH will probably solve an assignment in the most time effective way.
So to summarize:
If you were challenged in highschool, then the good news is you’ve got a leg up on people who weren’t. You know what you’re capable of, you know your limits, and you know what your time studying is worth to you. You’ve also probably experimented with different studying strategies and already know what works and what doesn’t work for you.
College basically has an unbounded difficulty slider, and I strongly suggest finding a configuration that really challenges you, but doesn’t take a toll on your life.
Multiple classes I took in just my first semester were far faster paced and much more challenging than anything I experienced before. For me, the largest jump in difficulty between any two points in my life was by far between highschool and the first semester of college. For me, highschool seemed to focus more on memorization than problem solving, so, it’s possible that if you struggled in highschool you might find college and the “real world” to be a better environment. To add to this, you really get to study what you want in college. While I did find college overall to be tougher, I was far more motivated and had far more fun learning. I know plenty of people who found college to be easier because of this. As you progress through your college career, you’ll also be spending more time studying what you want and less time on requirements. So this effect can manifest between different years of school as well.
But what I really look back on as a great time in personal development was the semester where I took the most challenging class I ever took in my life along with the most work intensive class I ever took in my life. It was not the best time in the moment, but I came out of it feeling like I could accomplish anything. I honestly learned so much about myself and I don’t think I’ve ever had a more rewarding experience. That was the only time I absolutely failed an exam, and I was so close to dropping the class since I wasn’t even confident that I’d pass. (In this particular class, there were 3 exams, each worth somewhere around 30% of the final grade. This kind of emphasis on 1 - 3 exams is basically the norm in college.) One big thing I learned was how much time and effort I am able and willing to put into work without it being too taxing. Another big takeaway was strategies to really understand something I am struggling to learn. I guess this can be best summarized as I finally learned how to learn.
Oh, here’s a little tangent on dropping classes. It’s absolutely normal and doesn’t at all imply that you’re somehow “not good enough” or that the class is “too hard”. If you had all the time in the world, I’d wager few things would feel “too hard”. But alas, you have to make tradeoffs and manage your overall time commitments. Sometimes that means a class just isn’t worth it for you. There’s an add-drop period for a reason. I’ve dropped tons of classes. Typically, there were more classes I was interested in than I could take, so I over-enroll with the intention of dropping the class I like the least. I’ve dropped classes because they weren’t interesting, I didn’t like the instructor’s style, the class would involve more work than I was willing to put in to it, I had too many other things going on, etc.
So to summarize:
It will quickly become obvious to you, but many classes (aside from big intro ones) are only offered in either the fall or the spring, and sometimes not every year. I found it helpful to make a big spreadsheet of all the classes that seemed interesting, when they’re likely offered (as sometimes this can change), prerequisites, number of credits, and how they play into my graduation requirements. I know many other students did similar things, but perhaps this is a very engineer-y thing to do.
As I mentioned earlier, I also liked to enroll in as many classes as they would let me, with the intention of dropping whatever I liked the least. This of course assumes you’re potentially interested in that many classes. You’ll quickly learn how best to “shop around” for classes during the add period.
I also liked to think about classes with respect to four major criteria:
I generally didn’t take classes that only scored well on 1 or 2 of these axes. Obviously, if a class is strictly required, that kinds of trumps everything else. But if that’s the only thing going for it you may want to consider taking it with a different instructor.
You may also want to choose classes to vary the types of obligations you have. For example, some classes have in-class exams, some classes have a midterm and a final while others might have two exams and a final, some classes might have final projects etc. For example, a class with only a midterm will likely not have an exam the same week as a class with two preliminary exams. You definitely want to read the syllabus.
In summary:
If you have the chance, I highly suggest being a teaching assistant (TA). This was one of my favorite things I did at school. I think the process for getting this position is different for different schools and even different departments within a school. For CS at my school, there was this application site that opened a few weeks after the next semester’s course roster was published, and you can just apply for whatever classes you felt you were a good fit for. I know other departments you would have to inquire with the professor directly.
I’ve known people who started TAing spring semester freshman year. I started spring semester sophomore year and took 2 semesters off to be a lead for a project team, but I kind of wish I got more time as a TA.
As a TA you’ll have a chance to work with the professor more, get to know other TAs and students, and really strengthen your understanding of the topic. You’ll also have to get better at public speaking and explaining technical topics clearly, which are not easy skills and something I personally had to work on. Helping other students feels extremely rewarding too.
The class I first TA’d was the first proof-based math course I took, which was our “math for computer science” course. I really enjoyed the class when I took it, but it definitely didn’t come easy when I took it, and the first time I TA’d it I felt unqualified. I’ve had my share of times accidentally guiding students down the wrong path or being unable to get something through to a student, it happens to everyone. The best we can do is strive to avoid it and work to always improve, and with time and experience. By my senior year I was far more confident and knowledgeable as a TA.
As a TA, you’ll also experience a different side of the education system. A professor I TA’d for said something along the lines of “students want to get a good grade, we want them to learn, and sometimes these goals are at odds with each other.” I think being a TA helped me enjoy the learning experience a lot more.
Grades are annoying sometimes, but if I (the TA) feel like a student isn’t understanding something, I would want to correct that. Yet I know if I get full points on a question, I’m not going to review it. Maybe right before the exam, but by that time it could be too late. Thus, we take off points. In that respect, an exam is really just another learning experience. There have been plenty of exams I took where I came out of it feeling like I understood the material more than ever.
This would be a good time to mention how grades differ in college and in highschool. I think this is common knowledge so I won’t dwell on it. But the gist of it is that an instructor wants a median exam grade somewhere around the 70s or so. Most people are understanding most of the material, but there’s plenty of room above and below the median to easily identify students who are excelling and students who are struggling. This also enables the instructor to try and challenge (and thus effectively teach) students who are doing better than most of their peers. At the end of the class, the letter grades are typically assigned in such a way so that a median score gets like a B+ or A- or something reasonable. Thus, depending on the class, getting a 78% might be a really good score while in highschool it might just be mediocre.
I don’t think I ever had a class that was “curved” in the sense that only x% of students get a top score which means that helping another student might actually hurt your grade. Almost every class I had tried to foster a somewhat collaborative environment, but this could be an engineer thing.
So in summary:
Be a TA if you can. You’ll learn a lot, meet cool people, and expand your network.
You don’t need to have had the material come naturally for you, but you probably need to have done decently well in the class. I would suggest choosing a course that interests you, but one where the thought of TA’ing it intimidates you. Someone once told me to “choose a job where you are at least a little bit scared.” If you continue to TA the same course, the intimidation will go away. I’m not suggesting you should then TA something else.
Grades in college are different. If you’re used to always getting high grades you’ll probably get much lower scores but that doesn’t mean you’re “not as smart.”
Joining a professor’s research lab is one of the best academic experiences I’ve had (this and TA’ing). You’ll meet cool people (other undergrads but also PhD students and other researchers), get to know professors, see what’s cutting edge in a field, read papers, work on real problems outside of a classroom environment, get a peek into academia, and just generally have an opportunity to learn so much.
The lab I was in had weekly lunches where we’d get lunch and someone would give a talk, typically about their research. Giving such talks was a good experience in technical communication, but it was also super interesting to hear about other problems people were working on. At a university, there are generally tons and tons of talks being done by visiting researchers, prospective professors, and other students about their own work or a paper they liked. In my experience these talks were kind of open to anyone, but only advertised to graduate students and staff, so as an undergrad I didn’t know they existed until I started doing research. Needless to say, I found many of these talks fascinating.
Then of course there’s the actual research itself. You pretty much get out what you put in. I got the chance to implement and work hands-on with things I wouldn’t have otherwise, which obviously strengthened my understanding. The problems I faced in research were more involved than what I would face in a class. They were also much more ambiguous and open-ended, which is not something students are typically exposed to in regular undergrad classes.
Research and teaching are probably the best ways to get to know a professor, and advice from the professor who ran the research lab I was in absolutely led to where I am today.
So in summary:
When I started my undergrad, I was pretty convinced that I would go into industry after shool. In my school, there was almost a sort of “academic track” of doing research and an “industry track” of being in a project team (like a club but with enough academic work involved to get credits and grades). They’re really not mutually exclusive, and many people do both. I will admit, I doubt I’d be able to participate at the level of involvement I had in both at the same time. I think most people do tend to focus on one or the other, even if involved in both simultaneously.
But I was so set on industry that I really just focused on my project team for 3 years, never really considered grad school, and never tried get to know any professors. While I think the experiences I had in my project team were valuable, not getting to know professors and not looking for research until my final year was a mistake. Even though I did end up in industry and have now worked closely enough with a few professors to get enough strong letters of recommendation if I ever decide to go back to school, there was a solid period of time where I was convinced on going to grad school and regretting my lack of research and connections. Luckily, I always strived to do well in my classes so there was never an “oh sh*t, I wasn’t planning on having someone care about my grades” moment. But I know people who came into this kind of dilemma.
So my big suggestion is be somewhat prepared for all possible futures. Even someone with a clear objective can wander far enough from their original plan to face unintended side-effects.
Another “wandering from the path” moment I had was discovering my interest in theoretical computer science, particularly programming language theory (PLT). This sort of first started with taking my first proof-based math course. I didn’t mind math in highschool, I definitely appreciated its applications from running into a lot of it when trying to make games. But I don’t know if I can say I really enjoyed it. I was pretty good at it, but I wouldn’t do it for fun. “Real math”, as some people might like to call it, is a very different thing that I never experienced in highschool. Instead of computing things, its kind of about discovering truths and patterns in the world. And then the many applications of this involve taking some concrete problem of interest you don’t know how to solve, and turning it into a problem in some abstraction that you do know how to solve. In other words, realizing your problem is just an instance of some common pattern. I have a few blog posts that involve employing graph theory to solve compilers problems. So yea, that’s an interest I never knew I had.
But the second part of this story is when I took a class in formal verification. The class seemed somewhat interesting, but I mainly took it because the classes I really wanted to take weren’t offered that semester or full. Formal verification (in this context) is basically applying the mathematical method of proof to software in order to prove, with certainty, that the software is correct, for some definition of “correct”. I really enjoyed this class. I didn’t fully understand it until I took a PLT class later, but a big thing it taught me was that PLT was an area of study and that I thought it was intriguing.
While compilers is something I knew I wanted to learn about before I knew what schools I was applying to, PLT wasn’t. And I can confidently say that it has made alterations to my career path, side projects, and how I think about things.
In Summary:
College courses are a different animal from highschool courses, and graduate level courses are a different animal from undergrad ones. Grad courses try to prepare you for research, and as such are less focused on lectures and structured assignments and more focused on class discussions and exploration.
They typically don’t have exams and instead opt for final projects which are are completely open-ended, unlike undergrad classes. They encourage you to apply what you learned to whatever interests you, for PhDs, this is commonly their own research. Grades matter a lot less, so you really get out what you put in. It’s often acceptable to put in like no effort for an assignment if you’re busy at that time or just aren’t interested in it.
Open-ended projects are really good for learning to deal with ambiguity. There’s going to be no right answer and sometimes you aren’t able to finish what you planned. Sometimes your hypothesis is wrong or your experiment just flat out didn’t work. You can see this blog post for an example of one of my projects which pretty much failed miserably. This is expected to happen to some students, and doesn’t hurt your grade.
Do be aware that while exams might suck, final projects aren’t necessarily better. They can often be more of a time sink than studying for an exam.
You’ll typically have to give at least one talk, either on the paper the class is discussing for the day, your final project, or both. I found giving talks to be really helpful for public speaking and technical communication. I did a bit of public speaking in highschool, but those presentations felt so simple and offhand compared to these. Undergrad presentations were also better learning experiences than highschool, but they occur much more rarely than in grad classes.
You’ll also meet some really cool people. You get to talk to PhD students and see what they’re researching, but also meet some crazy smart undergrads. Some of them are really intimidating at first, but once you kind of get to know them you realize they’re just cool people.
In summary:
I really enjoyed my time in school and think my professors did a great job fostering my curiosity and intellectual development. I’m finding what I learned to be very applicable to my career. The transition from highschool to university was a big jump that I noticed immediately, but going from college to the “real world” felt pretty seamless.
Despite this there are two major areas I think schools could improve. They aren’t avoided per se, but it’s not difficult for someone to graduate without ever becoming proficient in them.
Highschool has a ton of structure, you can’t even relieve yourself without permission. College has some structure such as regular assignments, but not much. “Real life” has basically no structure besides what you give it.
In particular, if you only ever experience academics through regular coursework, you’re going to miss out on dealing with ambiguity. In regular undergrad courses, assignments are designed to be completed by the due date, there’s basically always a “right” answer, and if you can’t figure out a solution, you can always get help from course staff who know what you’re supposed to do. This isn’t to say they’re easy or that you can always find a solution. Just because a TA successfully completed a project before doesn’t mean they can be plopped in the middle of your work and figure out what’s wrong with it. Or just because a TA has a solution doesn’t mean they can come up with a hint that gives you that “ah-ha” moment. But for the most part, there’s an answer, and you can probably approach it by the due date.
This is very much not the case in research, grad projects, project teams, or the “real world”. At work, I’m helping out with something that was supposed to be done like a year before I even joined. We really underestimated the work involved. And yea that happens. Almost everything I work on has little direction. It would be a waste of time and resources if someone had to figure out what the solution was before giving me the problem. This is kind of cool, as I can take things wherever I feel they should go. Sometimes, issues we get turn out to not even be caused by the component my team works on. Obviously, no one knows that until you start trying to resolve it.
In my project team a teammate and I were working on autonomy in an upgraded version of our operating system. Our goal was simple, yet broad: get autonomy working. We needed to figure out what that was going to entail. We made some good progress, but after a few months we couldn’t figure out this one issue we were having, and nobody knew more about this system then us. There were places we could kind of go for help such as online forums or ask professors who do related things, but no TA with a solution they could try and guide us towards. Autonomy did not go well that year. And sometimes, it happens.
I don’t particularly think dealing with ambiguity (or perhaps lack of direction is a better phrase) is some complicated skill that takes a lot of instruction and practice to master. But I did notice as a lead for my project team that most people, especially the newer members, weren’t very accustomed to it. People seemed to like to think of me as having the “right answer.” I ended up changing my leadership style to be more of a TA where I slowly exposed people to more ambiguity and less structure, which was a bit more work for me but I was happy to do it as I think it made the team as a whole much more effective.
So you (as a student) can:
In the off chance you might be an instructor, you can:
A common criticism I’ll sometimes hear is that “I’m not using anything I learned in school in my job”, to which I’d say expand your notion of the phrase “learned in school”. It’s really hard to identify improved problem solving or communication skills as something you learned in school and use in your job, but I’m willing to bet that’s true for many people.
However, I think what this argument is referring to is a lack of instruction about the tools of the trade. Academics will (rightly) argue that we don’t teach specific tools, we teach the foundational skills to learn new tools since by the time you get out in the workforce, whatever tools we taught you will be outdated. But proponents of the “school didn’t teach me anything useful” argument are right in that the surface level tools are important, and in some fields, there are tools with enough inertia that they really aren’t going anywhere anytime soon. If they do, something relatively similar will probably replace it. I think both sides of the argument are pretty valid.
In my experience, I had some courses which forced you to use some common tools of the trade but didn’t do anything to require or help you become proficient. I’ve had others that kind of pointed our their existence, but expected you to figure out or know how to use them. In almost all projects, effective tool usage would be very helpful and in some, it could make the difference between a simple and nearly unsolvable problem.
I have two hilarious examples of this.
The first is during my compilers project. My team and I arranged a good chunk of time, say 5 hours or so, for us to all work together synchronously. We were working on different parts of the project, but doing so together to commit ourselves to a chunk of time to spend on the project and to bounce ideas of each other. One of my teammates was really struggling with a problem, and after a few hours of him getting nowhere I figured I’d take a look. Sometimes you just stare at something so long you need fresh ideas from someone else. So I have him walk me through the problem and what he was trying. Immediately, I say something like “what in the world are you doing, why don’t you use a debugger?” (A debugger is a tool in software engineering). His response was something along the lines of him never really using one. So I fire up the debugger, and in a matter of like 5 minutes, I’ve identified and fixed the problem. I think his response was just a quiet “damn”.
The second example is two of my friends in my computer architecture class. They were afraid of git (another software engineering tool), and so for some time, would share code with each other by emailing it. So I ask: “what if you two work on the code idependently at the same time?” I think the response to that was something along the lines of “we make sure that never happens.” I think I also asked about how they deal with removing mistakes, and I think their answer might have been something like finding an old email and copying and pasting from there.
A final, and much less egregious, example comes from my distributed computing class. We occasionally had to debug by examining big log files, say 30 - 50Gb, too big for your regular text editors. There are graphical programs designed for this kind of thing, but I just figured I’d stick to lightweight command-line editors (vim) and some shell tools like grep to prune down the logs and search around for things that could be of interest for us. (The logs were big because it took some triaging to figure out what we even wanted to look at. Instead of logging one thing, then trying again but logging another thing, we just dumped everything to have all the information we might want from the get go). Anyway, my partner said something along the lines of “man, I wish I knew how to use these shell tools well.”
So how did I learn the tools of my trade? Well I’ll admit they’re not particularly complicated to figure out own your own, but it does take some practice and some time to know what they can do before immediately reaching for them to solve a problem becomes natural. I got pretty proficient with many of them in highschool from doing a lot of hobby projects. Git took until my second internship which was when I really had to touch a bunch of features I’ve never needed before. There are a few other tools I also never needed to touch until my second internship or my project team, some of which I never needed again until recently in my full-time job.
I think both of the earlier arguments are valid. There are students who are about to graduate spending way too much time on something because they aren’t comfortable with some tool. But at the same time let’s imagine a scenario where I went to school 20 years ago and the school did spend time teaching tools. 20 years ago, instead of git, they wouldn’t taught something like SVN. Fast forward like 2 years and all of a sudden there’s this new git thing that’s very different from SVN. I can’t say if this hypothetical instruction about SVN would be useless (I don’t think any knowledge is useless), but I think I can say that the hindsight of my hypothetical graduate might’ve wished the time spent on SVN would’ve been used for something less ephemeral. So we reach the impasse that is the state of today’s education system. Even today, I don’t think I would’ve appreciated taking away time from more interesting and challenging ideas to study tools. Yet I don’t think someone should graduate and be oblivious to them.
If you’re studying computer science, here are some tools you should probably learn as of December 2024 (this will depend on what area of CS you end up working in)
So you (as a student) can better yourself by:
In the off-chance you might be an instructor, perhaps you can:
Asking good questions on an interview, college tour, or anything else took me some time to figure our. Here’s my advice.
So say you just applied/got accepted/got an interview with some opportunity. Are you excited? Anxious? Why? If you’re like me you already started thinking or lightly daydreaming about some idealized future where getting this opportunity leads you to some really good outcome. What is that outcomes? How did you get there in your hypothetical future?
I think you really want to think hard about what you are hoping for, what qualities you are looking for, and things that would make you happy there. Then ask questions that poke at getting responses for this. I tend to think about the reasons why I applied in the first place and why I’m not looking at something else. For example, for industry/internship interviews, I’ll tend to ask something along the lines of “can you describe the rough breakdown in time a person in this position would spend in meetings vs dev work vs collaborating”. Besides the straightforward answer being useful to me, the way they respond typically gives me insight into things like: does this position have a lot of collaborating solving hard problems or is it more code-monkey-ish, what is the management style like, is the mentor/manager more hands-off, is there a lot of corporate “fluffy” “this could have been an email” type things, etc. Depends on where they take the question I’ll try and steer them to what I’m looking to get at. Of course, you could ask all of these questions in a more straightforward manner, but typically there isn’t enough time, so you need questions that hit many birds with one stone. And sometimes I don’t want to present myself as leaning one way or the other. Particularly in the case of internships where I was more than happy to take a good opportunity that maybe isn’t “perfect” over no opportunity. Another one I like is something along the lines of “when do you consider some feature/product/etc. to be done” to kind of see if I vibe with their testing philosophy or ideas of thoroughness, and get a sense of how a team controls their timeline (or doesn’t). I myself suffer from feature creep in many side projects so it’s also genuinely an interesting thing for me to ask others.
If you’re on an college tour, I would recommend asking such questions to students not affiliated with the tour. Maybe go into the building for your department, find some people who don’t seem busy at the moment and just go and say hi. Be understanding if they don’t have time. When I did this, students pointed me to a class I might be interested in, and I got a chance to speak with the professor who was teaching it at the time. If you do take this advice, don’t go with your parents, that might make it awkward.
So to recap:
The following discussion is going to be heavily based on my experience with CS (I mean this whole post is, but the next section will be more so). I don’t know how internships or interviews in other fields work. From my understanding, my experience is pretty similar to other engineers’, but outside of that, I don’t really know.
As a disclaimer, while most of this post centered around a theme of “relax, relax, don’t worry”, and I aim to do that in this section, I anticipate that theme will not shine through as much…
Some students will spend the summers either at an internship or doing research. Both are great learning opportunities. The exception is the summer after freshman year where most students typically do a hodgepodge of different things including relaxing at home. If you want to try and get an internship after freshman year it’s possible, but definitely don’t be discouraged if you can’t get anything.
My first tip is to know your field’s recruitment cycle ahead of time. You can snag research positions within weeks of summer starting (although I would suggest looking at the start of spring semester) but the same may not be true of internships. For CS, the internship application period is typically July - October for competitive internships. As a data point, I would typically start looking August - September, have interviews October - November, and get responses around December.
For my first internship, I didn’t know any of this and I started looking around January - February, got an interview in March and an acceptance around May. So getting internships later is possible, but this was a remote internship during COVID. This timeline is cutting it very close if you then had to start looking for housing and setting up relocation logistics.
My initial response rate (% of applications where I would make it to a first interview or phone screen) was pretty low, maybe 5%. From what I’ve heard, even this can be somewhat high. Most places would kind of just not respond or send you a rejection like 10 months later. In my experience, if I didn’t hear back within two weeks of submitting an application, odds were very low that I’d get it. So yea, I’ve definitely submitted 100+ applications some years. I’ve also never met anyone who had a drastically better experience. I’m not saying this to stress you out, I’m saying this so that you don’t get discouraged.
I’ve gotten my internships mostly by searching online. In CS, students at the University of Pittsburgh create a big list of internships every year. However, your school may have career fairs which might be worth checking out.
Typically interviews were 2 rounds, probably about an hour for each. For CS, at least one of them will contain a leetcode style coding problem. In these, you’re asked to solve an algorithmic question and walk through your thought process. Typically they’ll start off really easy, then make it harder once or twice to get to the real question they want to ask. Every one I’ve ever got was always pretty reasonable and applicable to the actual position. I never got anything that required knowing about an esoteric data structure or algorithm. For practice, I tended to try and solve leetcode mediums (hards sometimes require knowing something niche) in about 15 - 20 minutes or less while thinking out loud to share my thought process with an imaginary interviewer. I didn’t practice these problems religiously. I Probably did about 10 - 20 per year before and during the application process. Checking my account, it looks like I’ve done 50 problems: 45 medium, 3 easy, and 2 hard.
Interviewers are looking for someone they can work with. So it’s totally acceptable to ask questions. Forget the exact syntax of something or the name of a function? Just ask. I had one interview where you were supposed to ask for clarification and another where pulling up the language docs was expected. My biggest advice for these type of things is that silence is ok. Allow yourself time to think. Don’t just start going with the first thing that pops into your head because you feel like you need to give an answer immediately. Before saying something, maybe take at least 10 seconds just to think about it first. I liked to use a whiteboard, and I would reserve a private space on campus with a whiteboard for these things (assuming your interviews are remote). I found it much more helpful to basically solve the problem and quickly convince myself it (probably) works first on paper or a whiteboard, and then code it up. This is the time where interviewers would typically chime in if I wasn’t going down the right path (which is totally ok) or if my logic wasn’t quite right. Then I’d have a clear plan of action for implementation and I wouldn’t feel too bad if I got quiet since they already know what I’m trying to do. As a bonus, I think this allows interviewers to verify that I know what I’m doing and that I know how to code separately so that even if I run out of time to correctly implement my idea (which has happened on multiple occasions), they get at least some sense of my abilities. Thinking, coding, and talking all at once is a lot.
Interviews might also have a design problem where you have to design something (no coding) and discuss your design with the interviewer. In both coding and design problems, I would suggest thinking of it less as a test and more as working together with the interviewer. If you get the position, that is what you’ll be doing after all.
Outside of these, most of the other technical questions I’ve received were knowledge checks and resume reads. The former would be something like “what is X” or “describe Y” and the latter might be something like “what challenges did you face in your work on Project Such-and-such?” or “how did you implement this in Project So-and-so?”. Don’t be afraid to say you don’t know; a highschool teacher I once had always said something along the lines of “I don’t know is the smartest thing someone can say.” I’ve gotten offers after interviews where I didn’t know the answer to some questions or fumbled a coding problem.
While these questions always seemed easier and less stressful than coding problems, I always prepped for them by going over my notes on topics I thought they might ask about. I’ve had multiple instances where I ended up talking about something I wouldn’t have remembered if I didn’t review. As a bonus, when this happened I would tend to come out of the interview understanding that thing better than I did before. Interviews, like exams, are learning experiences.
The final major part of the interview is your turn to ask questions. I’ve already talked about this, so I won’t repeat myself. But I will say many interviewers want to see that you’re passionate and curious. You really want to ask questions that you genuinely want to know the answer to. Of course there’s the simple, yet important, “what’s the rest of the interview process like” but I always tried to think of something I genuinely was curious about regarding the company, the work, or the field in general.
While the interviewers are the ones asking the questions most of the time, interviews are a two-way street. You’re interviewing them as much as they’re interviewing you. The questions they ask and the style of problems they pose to you give you insight into what they’re looking for and in turn, what the position will be like. For example, I had one coding question where the interviewer had me write a test-case for the problem. I surmised testing was a big part of the work they do, so when I had a chance I asked a bit about their testing infrastructure and opinion on testing philosophies like Test-Driven Development. I’ve also had an interview where the prompts were specified in great detail and the interviewer was less present. Not in a bad way, more in a “I want to see what you can do without me saying anything” kind of way. I figured independent implementation was something they were looking for and guessed that the internship would consist of implementing highly specified feature requests and less of design and discussion.
If you feel like they’re looking for a quality that corresponds to a role you’re not looking for, then that could potentially be an indication that you might want to look elsewhere. It’s definitely important to ask yourself about what you hope to learn, what skills you’d like to practice, and what you might hope to achieve. Note that finding out if you’d be ok taking a permanent position in a certain location (say across the country away from all of your family) is quite a valid response to that question.
I’ve always known at the end of an interview if I had “passed” it; I’ve done well in all the interviews I’ve enjoyed or had fun in. I’m typically more critical of myself, so I’ve had many interviews where I moved on even when I thought I wasn’t going to make it. In my experience, if you think you messed up, take the severity of your mess-up, divide it by like 2, and that’s probably how the interviewer sees it.
For some really competitive CS positions, prior to an interview they’ll send you a timed take-home test. Typically these will consist of randomly selected algorithmic problems liked the ones I discussed earlier. I think many fin-tech companies do this but pretty much no one outside of that. Roblox had an interesting take-home test where you had to complete puzzles in a Roblox game. This was buggy for me, and I didn’t feel like jumping through the hoops of contacting someone and making a bug report so I just quit while I was ahead.
If you’re really interested in working for a company that requires a take-home test, then by all means go for it. But this was not the case for me, and I didn’t feel like going through the extra step. Especially, since I’d have to do it again in an interview if I made it to the next stage anyway.
Everything I’ve said so far seems to apply to the full-time job search as well. The major difference is that full-time jobs will typically have more rounds of interviews. I think my job had 5 or 6.
To recap:
In highschool, generally everyone starts at the same point in their life and ends at the same point in their life. While I think many people in undergrad start the fall after graduating highschool and take 4 years to complete the degree, this is not everyone.
I’ve known many people who waited some time after graduation before starting undergrad. I’ve known some people who weren’t sure what they wanted to do, switched majors a few times, and ended up taking a bit longer to graduate.
Easily one of the coolest people I met in school was this guy who was quite a bit older than most people in our class. After highschool he was a rescue diver for the Navy for some time, and then when he did go to school, he switched majors a few times. I don’t remember exactly, but for argument’s sake let’s say he graduated in 6 years. Just talking to him, I really felt like he was so much wiser and more experienced than the rest of us. He was also going at a pace that allowed him to enjoy his time while in school; I believe he was taking just the amount of credits needed to be considered a full-time student. He was just a cool guy who seemed like he had everything figured out and was enjoying life. I loved all that I learned and accomplished in my last year of school, but I cannot deny that I didn’t go to any bike races since I felt like I couldn’t take a weekend off.
As an opposite data point, you don’t need to your life figured out by now. I don’t have everything figured out.
To recap:
For me, school was an amazing experience and I hope you get as much out of it as I did. This is basically all the academic advice I can think of and I hope it was at least somewhat helpful. Here’s all the summary points in one list:
If you feel like you taught yourself a lot, you probably didn’t so don’t be an ass.
Your professors are probably right, even if what they’re suggesting doesn’t resonate with you now.
If you think you’re unqualified due to all the people who are coming into the undergrad program with prior experience, know that this “prior experience” is mostly fluff. In a semester you probably won’t be able to tell the difference between people who did and didn’t have prior experience.
Try to be engaged and get value out of every class you take.
Try to make connections between classes outside your major and classes within your major, it’s much easier than you might think.
Think about the applications of a class on not just your career, but on your life as a whole.
Sometimes it’s hard to convey the bigger picture to students, your instructors have wisdom and experience you don’t. Occasionally, you just have to trust what they’re telling you, even if it seems annoying.
Readings can be annoying, and I’ll admit there have been many classes where I didn’t do them. But I guess try to do them? If nothing else, give them at least a skim before the exam and if you think there’s something juicy in there, make a note to come back to it later when you have more time.
“Good” schools seem to differ mainly in people. The core curriculum is basically the same, so this difference really just provides networking and some flexibility to change or discover new paths in the future. It’s much more productive to rank schools based on how you might like it there.
Find out if you really need textbooks before buying them. And, you know, there are ways to get ones without paying full price.
Don’t hold what someone says or does against them for too long. Even in the span of a week or month they could be different.
Be open about not knowing something, and be helpful to people who don’t know something you do.
Believe it or not, effective teamwork is a skill (that imo isn’t adequately practiced in highschool). You’ll get better at it.
If you have a leadership opportunity, take it. Working effectively with others and being effective in a managerial role are two completely different games. Both are valuable.
Office hours are not just “extra help”, don’t be intimidated to go to them. Nobody cares if you do. Everybody goes to them at some point.
Even if you’re not stuck, confused, or in need of clarification, OH are just a great place to meet other students, TAs, and professors and get ideas on both course-related and unrelated things.
Start assignments early. Give yourself enough time to think about things on your own and go to OH.
Be prepared for a change in difficulty between college in highschool. It might become easier or harder, depending on you. If it’s the first time living on your own, consider the potential added difficulty of figuring that out.
College allows you to choose how difficult it’s going to be. Find your limit and then configure your experience to stay a bit below it. This is about the level that’s most rewarding and most effective for learning.
Dropping classes is normal, nobody thinks any less of you for doing it.
Read the syllabus. Also consider how different selections of classes will affect your exam schedule.
Shop around for the best schedule you can get. Think about the most important things about a class experience for you, and grade classes you’re considering to take using that.
Get a vague plan of potential classes to take, if you’re the kind of person who would do that.
Different instructors tend to teach the same class in different ways. The instructors might have different reputations, so you may want to try to take the class with an instructor that works better for you.
If you liked a professor, see what else they teach or consider asking them about research opportunities.
Be a TA if you can. You’ll learn a lot, meet cool people, and expand your network.
You don’t need to have had the material come naturally for you, but you probably need to have done decently well in the class. I would suggest choosing a course that interests you, but one where the thought of TA’ing it intimidates you. Someone once told me to “choose a job where you are at least a little bit scared.” If you continue to TA the same course, the intimidation will go away. I’m not suggesting you should then TA something else.
Grades in college are different. If you’re used to always getting high grades you’ll probably get much lower scores but that doesn’t mean you’re “not as smart.”
Do research if you can, you’ll meet interesting people and learn a ton.
Get to know some of your professors.
Even the most steadfast person can’t predict how they’re going to change. Don’t make any decisions on bad assumptions you might regret later.
Did I already mention get to know your professors?
Classes are potentially new interests in disguise. Be open-minded.
If you can, consider taking a proof-based math course. The problem solving, formulation of clear and concise arguments, vigilance for bad assumptions and illogical reasoning, and practice with writing precisely can be useful for anyone.
Don’t disregard a subject, even if you didn’t like it in highschool. There’s a chance that your teachers taught it in a way that didn’t jive with you or that the subject is completely different at the college level.
Take a grad class if you can. You’ll practice some skills not typically exercised in undergrad classes and meet cool people.
Don’t be intimidated by others who you might see as far smarter than you. You deserve to be there just as much as they do.
If you can, take grad classes, do research, or participate in extracurricular academics.
If you can, get a summer internship, co-op, or attend a summer school (not like summer school in highschool. These are almost like academic conferences geared for undergrads but greater focus on teaching the participants).
If you get the opportunity to be in a leadership position, take it and treat it as a good learning opportunity.
If your professor mentions some tool, or you need to use some tool for a class, take the time to try and become proficient in it.
Currently, the best way to learn tools in class seems to be from classmates. If your classmate mentions some tool, be curious. Ask them about it and look into it on your own time.
Ask TAs what tools and techniques they use. Our classes typically had forums, so if yours do as well, you can pose this question to students, TAs, and the instructor there.
If you find yourself thinking “there has to be a better way” when doing something, I’m willing to bet there is. Search on the internet or ask Reddit.
Asking good questions [on an interview/tour] is hard, try to ask questions that see if the opportunity matches what you’re hoping for.
Know your field’s recruitment cycle so you don’t miss out.
Finding an internship is time-consuming. Don’t underestimate the time commitment. I had a professor who suggested you consider the internship search like an extra class and plan your schedule accordingly. Interviews can take about as much studying and prep as a regular exam.
Don’t get discouraged about rejections or not finding an internship. There might be a lot of applicants and they just might not have the time to go through everyone thoroughly. Everybody I met gets rejected from many internships they apply to.
You don’t need to give immediate answers [to interview questions]. You also don’t have to come up with answers completely on your own. Breathe, pause and think, and ask questions.
If you mess up, you probably think it’s 2x worse than it actually is.
Don’t worry if you end up taking the “scenic route” through school. Not everyone follows the same schedule like in highschool.
You don’t need your life figured out by now. You don’t need it figured out when you graduate either.