HACKER Q&A
📣 priesthood

I’m New to Computer Science and Engineering. Any Advice?


Hello wonderful people here, I'm taking a computer science and engineering course at the university level. Any advice for me before I proceed?


  👤 droidno9 Accepted Answer ✓
Learning the material well and getting good grades are not necessarily correlated. If an assignment has grading rubrics, satisfy them literally and you'll get a good grade. As for really learning the material, it's often challenging to do within the timeline allowed for a course, especially with other courses competing for your attention. Just try to do well and get through the semester/quarter, then afterward when you have more free time, pick the subjects that speak to you and go through the material again, this time with the objective of internalizing the knowledge. Feel free to supplement your school material with material from other sources. Remember that what you're learning in school will only scratch the surface of CS; the real learning, if you choose to pursue it, will happen afterward.

Best of luck!


👤 thenerdhead
Many people will give you computer or programming advice, but I'm going to give you advice I wish I had when I enrolled a decade ago.

Learn how to learn.

Seriously. Pickup a course and a couple books about how to learn. At the time I went to college, an upcoming author named "Cal Newport" had a blog called StudyHacks and wrote a couple books about how to get straight As and win in college. Those two books alone made the difference of a bored high schooler graduating with a high GPA and now working in big tech.

My recommendations would be Barbara Oakley's recent books or course, Cal Newports older works and deep work concepts, and any habit book like Atomic Habits / Tiny Habits / etc.

Work on your system. Have a plan, iterate regularly, and most importantly do your own work. Cheating only cheats the future version of yourself.


👤 notapenny
- Focus on your fundamentals; learn how to do basic stuff like manipulating data structures, flow control and how to write clean understandable code really well. Forget about the 100s of frameworks and which language is better, that stuff doesn't matter.

- Build real stuff, but realise you're still learning. You won't build a whole application or website with bells and whistles just yet. Instead use that to figure out what you need to learn either now or later and where you want to take it.

- Don't feel stupid. Impostor syndrome is a real thing and even the most experienced developers experience it in some form. If you can't figure something out, take a break, take a few steps back, get help (even if its explaining to someone who has no clue), or try to cut up a problem into smaller pieces.


👤 stayfrosty420
Follow these tips and you will (probably) never have to work that hard (except on projects) or pull an all nighter:

- go over the lecture material yourself a few days after for every lecture

- start studying for the exam 2 months before but only for an hour or two a day. By the time the exam rolls around you will be so well versed you can take a few days off before the exam

It's hard to do but will make your college experience way less stressful.


👤 honkycat
Stay organized. Keep a list of tasks you need to accomplish, check them off as you accomplish them.[0] Buy a folder to keep your hand-outs in.

Your syllabus is important. It has EVERYTHING on it!

The University gym is probably the cheapest membership you will ever have. Join a lifting or boxing club, get fit, and stay fit.

Sleep is your brain cleaning itself. Staying up late is a trap. All-nighters are a trap. You will be more productive in the morning with a clean brain.

I didn't party in school, I had to work during the day and go to school at night as a 20 year old. I would have KILLED to be able to participate in University life, like joining volunteer organizations and making friends.

Stay on top of your studies, but do not waste time trying to get drunk and laid all the time[1]. And ESPECIALLY do not waste your time in World of Warcraft or whatever is popular these days. You have SO MANY RESOURCES at your disposal you will NEVER have again. Join a music club, join a volunteer club, join a video game club. Do ANYTHING other than sitting in your dorm room/apartment browsing the internet.

0: https://bulletjournal.com/pages/learn

1: Some of the time is of course perfectly acceptable ;D


👤 fsloth
Computer science is more about math than programming.

Software engineering isn't really engineering - it's more of an eclectic mix of things that people have found out are useful to produce working programs.

Sadly our field lacks near complete scientific rigour in figuring out how to actually write programs.

Which is not to say software engineering isn't usefull - it is! But it reminds more of a trade school subject than an academically rigorous one.

Hence prepare for occasional cognitive dissonance when discussing with people from actual engineering degrees.

The only way to learn to program is to program a lot.

Good luck and remember to have fun!


👤 TrackerFF
- Read the weekly syllabus BEFORE lectures, don't expect the lecturer to teach everything you need to know in those lectures. Meet up to your lectures religiously, by the time you're halfway into the semester, most of the class will not show up.

- Go the extra mile, don't just do that bare minimum. This means doing all the problems in your problem sets, including the "bonus" problems.

- Find someone to work/study with. It's incredible how much of learning comes through discussions with peers, and trying to figure out stuff together.

- Start on projects and take-home exams as early as possible. Something will come up, and some things will go wrong.

- Work consistently, make a schedule you can stick to. Cramming and pulling all-nighters is a terrible way to learning things.

- If you find some topic that really interests you, discuss it with the professor. Maybe they need some help, or know someone else - excellent time to get some light student research experience.

- Try to get experience as soon as possible. Start applying for internships and similar.

But most importantly: Enjoy your University years! Have fun, meet people, try new things. Join clubs. Also, be active...you'll join the workforce soon enough, and it's good to enter that stage of life with healthy routines.


👤 kandruszkow
Don't expect to learn everything during the course (that applies to any degree to be honest), but I see so many young people settling on the knowledge they gain from courses and don't look further. Yeah, classes are great but they are not everything.

👤 aristofun
Focus on whatever process/challenge you have currently at hand. Be it your homework, exam preparation, course project etc.

Because the main and only ever relevant skill you should learn is the skill of learning, ability to be focused and present being an essential part of it.

You'll have plenty of time wandering on forums like this later in life, trust me, I've been there :)


👤 dj_mc_merlin
As non-technological or academic advice.. maintain a healthy "study/life" balance. Keep enough time to socialize and make connections. Do fun things.

Having good social skills and some nerve can put you head & shoulders above other people in an interview. Once in a team, being able to communicate effectively makes projects much easier. Many times when engineers complain about lack of clarity, what they really mean is they were not able to communicate with the other person.


👤 zorr
Approach every technology you encounter like a box. Look at the box, weigh the box, play with the box, figure out how it behaves when you interact with it.

And then, the most important step, open the box and look inside to understand how it works. Often you'll find a number of new boxes to explore.

In my experience, the people that do well in this industry are the people who aren't afraid to look inside the box.

Also remember that every box was crafted by fellow humans like you and me.


👤 Dumblydorr
Learn to master your keyboard. Figure out shortcuts for all the common functions. The faster and more accurate your typing, the quicker you'll work forever.

👤 matt_s
Be curious about how things work. Computer Science is really about giving instructions to the computer for it to do something - output something to screen, place some bytes in a file, add two numbers, store something in memory, send some bytes onto a network, etc. As you learn things, explore and try things out - the worst that can happen is you see errors.

A simple example: once you learn how an if/then/else statement works in whatever language you are learning in, put some different data types into the if clause - strings, integers, floats, arrays, etc. See what happens. Don't just finish the assigned exercises and be done, explore a little.

Much of the technical aspects of programming can be learned on your own. Since you are at a university setting, interact with professors and other students to expand your knowledge, ask questions, explore tangential topics.


👤 taubek
I would say try to build portfolio of your projects as you work on them. Make it publicly available (git hub perhaps?). Try to find collogues with similar interests, work on projects with them. Make something that you can show along site of you diploma once you finish the university.

👤 pbalau
Your code sucks and it will suck for the next many years. Therefore, DO NOT start building a "library of useful functions". Build a library of knowledge, learn how to iterate over files in a directory in sh, bash, python, matlab. Then when you have to do it in ruby, you already know the basics and you can ask questions about what order the entries are going to be returned, will the list contain . and .., can I filter out some extensions etc.

There is a sister theory to the above: never automate things you don't fully understand. Let me rephrase: do not automate hard/complicated things. Automate tedious things. When you are fully confident of doing a thing manually, then you should automate it. Not before.


👤 krisbolton
Hello there. Some random bits that I found helpful: 1) start assignments as soon as they're given (or at least fully understand what is expected so you can plan time), then you won't be rushed and your work will be high quality. 2) learn how to write academically - sure, you know how to write but unless you've done it before you probably don't have the experience of condensing multiple pieces of referenced material into a paragraph. There will be books on this in the library. This goes hand-in-hand with achieving high grades, if you understand what a lecturer expects to see, you can do well. If you find yourself working hard and then getting a mediocre grade, its because you haven’t understood what’s expected. 2.1) visit the library and see what workshops they have on writing, referencing, research and any other university skill – take those! 3) learn how you learn, or at least actively use multiple methods if you’re unsure. Watch videos of topics covered in your lectures, read books and write notes from the books (actually use those little quizzes at the end of chapters to test your knowledge and work on areas of weakness), write flashcards and use them. 4) Read ahead on areas you think you might struggle with or areas you’ve not been exposed to before (you don’t know if you’ll find it hard and ‘waste time’ grasping the basics be under pressure and miss the opportunity to take advantage of lecture time. Or just read ahead because you’re interested. 5) Understand lecture time is a tiny amount of your time overall in university, it truly is down to you to learn. Its an active process – you have to be interested, engaged, plan and do additional work to understand and do well. 5.1) ask questions in lectures. Write questions to ask when you're doing assignments or reading around the subject. 6) Build a structure and keep to it – this is definitely a personal preference, it may not be your thing – whether its waking up at the same time everyday and going to bed at the same time, blocking periods for work, exercise, playing games, and doing it no matter what. When you’re so busy its important to ensure you control your time. It doesn’t have to be rigid, the goal is to provide structure so you can succeed, you can always choose to not follow parts of your plan. 8) Absolutely take advantage of the social life and various activities, clubs, societies etc, you can’t work all of the time!

👤 hmurraydavis

👤 jokethrowaway
Understand what success looks like for you in 5-10 years. Not planning is planning for failure.

Is it being a millionaire employee at big tech? Is it working a little from the beach and starting a family? Is it not having a boss and running your own business?

This is one of the few fields where you can actually shape your life and leverage the need for developers to your advantage. Don't waste your opportunity and try to work

Try to work towards the best version possible of your future.

If you build something to scratch your itch, try to polish it and market it a bit online, so that you can use it as something to show off in an interview or as the start of a new side business - or even just as social media post to build an audience for a future business.

If you're working as an employee, try to grow your career and think how projects and roles would look like on a CV, no matter whether you're working on your career or not.

Maybe one day you'll be able to use that line on the CV, that side project or that side business.

I'm not saying you should disperse your energies too much (for example: I wouldn't recommend going crazy on OSS contributions, I did that and it didn't bring me nowhere), but if you're doing something that could be useful, do that extra 5% and create value for your future self.

Best of luck


👤 kazinator
Don't miss lectures; do the assignments, even if most of the course grade is from exams; every percentage counts. Start on programming assignments early; there can be unpredictable debugging difficulties, which can turn into consecutive all nighters if you start a day or two before. Use reliable reference materials for languages and libraries. If you're a complete newbie, learn to use a programmer's editor. Try getting some simple programs working in the language you wil be using. Like, today; don't wait until three days before an assignment is due. Keep your work secure; if someone copies you and gets caught, you might both go down even though you're innocent. Keep track of what is on the midterm and final exam. If the textbook is expensive, borrow it from someone and take pictures; going without the text is risky: if your notes are poor, you may have nothing to cram from before the exam. Double check important dates and times; don't show up for an exam on a Wednesday only to find it already took place Tuesday. Find out what support there is for difficulties: availability of the professor or teaching assistants for asking questions and such.

👤 OliverJones
Go for it! You can have a really wonderful career in our trade. I sure did.

Consider the long term. Your uni work will take you roughly half a decade to get through, maybe a little less if you hustle. Your career will last roughly half a century, maybe more if human life spans continue to increase. Take advantage of your uni time to explore as many parts of the world of thought as you possibly can. Take risks. After you leave uni, noboby will care that you got somewhat low marks in that strange particle-physics (or whatever) class you signed up for.

This sounds trite, but it isn't: learn to learn. If you work in our trade (or any knowledge-based trade) you'll be learning for your entire life. You'll choose your jobs and assignments based on how much you can learn from them. Build your skills at extracting value from books and deciding which parts of them deserve a lot of your time and which don't.

One of the best ways to learn is to teach. Think of every assignment and problem set as an opportunity to teach somebody something. Every bit of work you do is an opportunity to teach. By "work" I mean creating things like documents, drawings, code, and so forth. Get in the habit of making things that are, at least potentially, useful to other people and to your future self. And when you gain enough knowledge in particular things, seek out opportunities to explain them to other people. Surround yourself with people who have the same attitude.

Get in the habit of prioritizing your work. You'll always have more to do than you can finish, so learn what to blow off. At the beginning of every uni term, take time to go through the schedules and syllabi for your classes and projects. Start by extracting the due dates for projects and putting them into a to-do list that works for you. Use a calendar app, or an electronic to-do list, or even a sheet of paper you can stick to a wall. That will get you started on planning and prioritizing. And, it will help you avoid nasty surprises like "oh no, I have a final exam in differential equations on the same day my project is due. And that day is tomorrow!!!"

Friendships and romances? Of course. Sex, drugs, rock-n-roll? Of course. Clubs, adventures, sports? Of course. Have fun. I joined a cycling club where we learned together how to work on bikes and took epic trips. But don't waste your uni years by overdoing those sorts of things.

All the best to you!


👤 sloaken
Read the chapter in the book before the lesson. This is essential before the first day in class.

Sit in the front row, ideally the center.

The first test is the most important. But is dependent on class size, the bigger the class the less it matters. e.g. class of 5, if on the first test you score an A, then the teacher will know it. If you come up short later, the teacher will wonder what they did wrong, as you were clearly understood the earlier material. In a class of 100 the teacher probably does not know you or your test result.

Discuss the projects with others. You might think you understand it, but talking with others will often help you clarify ambiguous items. Seems like all projects / assignments have a large degree of ambiguity.

For each / any programming class, make sure you learn how to use the debugger. Learning how to debug effectively will save you huge amounts of time.


👤 ccuqui
Since you * ASKED , These are the things I wish someone had said to me when I first entered university: - The main objectives of any university course (IMHO) are 2: teach you how to learn anything by yourself and "build networking" (professors / friends / partners, etc); - Don't drown in too many activities in the first 2 years (until you cover / pass ALL * math basics - calculus, linear algebra AND physics / statistics. The reason: all of these subjects are prerequisites for * many * other subjects and if you fail any one, it will EASILY cost you an (extra) year. - About math/physics stuff: try to learn how this math is used in practice in CS/engineering. This will give you the motivation to deal with (sometimes) extremely dry and abstract concepts; - Study every day (a little) and DO THE EXERCISES! It's impossible to learn math/physics/cs without solving tons of exercises/programs. If possible, read the contents of the next class before the class. With this, you will have questions / doubts in class and will be able to clarify them directly with your professor, which will save you precious time. It is impossible to learn all the content immediately before the tests. - If the recommended bibliography is too difficult for you, don't panic! Start with easy / basic books to understand the basics, then move on to the indicated books (they will, now, be easier to read). - Remember the "build networking" part? Parties are also part of this process ;-) But don't overdo it for the first 2 years (as explained before). - About all alphabet soup (languages / frameworks / tools / etc). Forget about them at the beginning. Keep your focus on data structures, concepts, algorithms, logic, etc. This knowledge will last for decades. Tools / languages / frameworks, lasts months / years with VERY RARE exceptions; - Take care of your body! After all, it's the one who carries your brain everywhere; - And the most important: ALWAYS BE ETHICAL and LOYAL to your values! And don't let anyone/nothing change that about you. At university / large companies your values/ethics will be tested. Trust/ethics is like a crystal: once broken, it cannot be fixed.

👤 digitalsushi
If you're taking an intro course, make friends with the loud students and challenge everything they say.

If you're taking an advanced class, make friends with the quiet students, and believe everything they say.


👤 bsenftner
Practice public speaking, and learn the art of speaking up for yourself. This industry is overwhelmed with poor communicators. If you are competent but a good communicator, you'll do well. If you're actually a decent developer/engineer with good communication skills, you'll be placed in leadership roles. Do not underestimate this advice: good communications has exponential impact on every aspect of life.

👤 davedx
Enjoy the social side too! (corona permitting).

Try to keep in mind subjects that seem utterly theoretical and possibly useless are usually in there for good reasons, and you might encounter them in your career more than you'd expect.

Take time to absorb the math-related concepts too, chances are it will come in handy if you become a programmer.

Purely biased based on my experience: do your internship(s) somewhere that pays you, like an investment bank or something.


👤 rokob
Your phrasing makes me think you are not in the US so I can’t speak directly to how your university might do things. But CS is more about pen and paper and ideas than it is about writing code. Don’t presume that you are learning how to build software the way it is done in industry. That being said, the material is a solid foundation for learning how to think about logic and tradeoffs.

👤 radmuzom
No advice, but an observation from someone who completed his CS degree a couple of decades back.

The best computer scientists I know (PhDs from top universities in US) cannot write hello world in any programming language.

Some of the best software developers I have met, with a history of shipping performant and intuitive software, have no clue about computer science.


👤 ratsimihah
You won't be doing much if any any electrical engineering if you end up doing software engineering, but it can be useful if you're hacking on side projects, e.g. Arduino. And as other mentioned, the best way to learn computer science is to build stuffs on the side, that will give you a huge edge when entering the job market too.

👤 FinanceAnon
If you haven't already, get a head start on learning the programming language for the course (C++, Java, Python).

One of my regrets about my time at university, was that I focused only on the course and the exams, and didn't build and tinker with my own stuff much. I think it's good to try to build some small websites or apps on your own.

Have fun!


👤 mooreds
I have a whole blog full of advice (mostly non-technical, some tactical and some strategic):

https://letterstoanewdeveloper.com/

You might get better answers if you were more specific with your question, though.


👤 alenmilk
Beware of the imposter syndrome. It never goes away. If your old code looks awful and embarrassing, you are on the right track (you are learning). Focus on learning to read code. It is more important than writing. Find a good open source project and read some good code.

👤 originalvichy
Do all your classwork. Every single bit. There is a real thing when you are in the habit of writing code a lot. It makes it easier to write more. So keep your rhythm up by doing all classwork all the time and don't keep long pauses if you wanna stay hot.

👤 alysgrif
Self learn is the king, you should invest in your own learning style and google is your friend. Don't be stuck on a tutorial hell and start building things right away after you understand the concept.

👤 martopix
I'll say what I say to all perspective university students: for me study groups were what literally got me through the first year or two. Your classmates are not adversaries. Work together and have fun.

👤 FerretFred
Have side projects. Self-host something to keep your skills up. Train yourself in a manual skill/trade for when you can't take the corporate LALALA any more: I taught myself plumbing.

👤 dustymcp
Expect to learn on the side use as much time you can to get to learn your tools, dont only use schooltime make it a passion, and you will never Work a day in your life.

👤 hermitsings
Udemy or taking online courses should speed up learning than reading docs and blog tutorials. Keeps you more engaged. This is just from personal experience.

👤 7thaccount
Just a course or are you starting a degree program?

👤 s0rr0wskill
self learning is important if you want to get far

👤 shaolinspirit
love what you do, do what you love

cheesy but golden at the same time


👤 ingen0s
Read the docs!

👤 jtwigg
pragmatic not dogmatic.

👤 btschaegg
1.) Be curious. Stay curious. Experiment, play with things.

Your time during university is likely the best time for this and it will likely get harder later on when you're on the job and there's much more emphasis on finished work than on learning experiences.

Also, I'm quite sure that it will be beneficial for you if you familiarize yourself with different ways of thinking (obviously programming languages, environments and paradigms, but that will likely apply to anything non-technical, as well). I gained this perspective from dealing with people who didn't really do that, but also from knowing that I personally also did this way too late (and from the benefits it brought me nonetheless).

If you're only familiar with Windows, try Linux. Try BSD. Try OS X, if you want to. Try working in the terminal. Familiarize yourself with different editors (especially Vim and Emacs, maybe also newer ones like Kakoune). Learn bash, have a look at AWK and sed. Maybe learn Perl. Try out functional programming, logic programming (like Prolog) and so on and so forth.

If you're feeling adventurous, play with niche systems like Haiku[1] or TempleOS[2], just to gain new insights on how things could work. Maybe try the ACME editor[3].

  [1]: https://www.haiku-os.org/
  [2]: https://templeos.org/
  [3]: https://wiki.c2.com/?AcmeProgrammingEnvironment
Of course, there might be courses that will nudge towards some of those tools. If you visit some of those: Cool! But if there are no such courses (I didn't encounter many of them myself), try to explore these things nonetheless. Even if you won't be using them day-to-day, they will all provide you with new insights and you will likely profit much more from them than only looking at one established way of developing during your studies.

Also, don't think you have to get good at any of them. You even might really not like some of them. But still, try them and see what sticks. For example: Give Vim a real shot. If you think that it's really not for you after a couple of days/weeks, at least you're sure now. :)

As food for thought:

A language that doesn't affect the way you think about programming, is not worth knowing. -- Alan J. Perlis

2.) Really try to become "computer literate". This is orthogonal to whether you are good at software development and/or computer science or not.

I mean that you should want to be able to solve small problems quickly with the help of a computer. Make no mistake: I work with experienced, well-educated developers that aren't (at least in my book). If they encounter small problems, they won't solve them nonetheless, because it would be a chore both if done manually as well as done with the only tools they know.

For example: When it comes to a lot of plain text things, knowing how to use the UNIX chainsaw [4] is a huge benefit. For things like dealing with data and numbers, it might be Excel, R, Julia or various Python libraries.

Bryan Cantrill explains this beautifully here[5]. There are many problems where you want a properly developed solution that will be absolutely correct. But when your problem isn't one of those, you can only lose if you try to approach it as one.

In his book "How to Measure Anything"[6], Douglas Hubbard laments the tendency of humans to say "I cannot measure this perfectly, so I won't measure it at all". The same problems also exists with many one-off tasks in IT: People who aren't "computer literate" either do them by hand (a giant waste of time) or not at all (because doing them in Java or the like would take days). And this often includes programmers that (for example) never had a look at AWK or Perl.

  [4]: https://www.youtube.com/watch?v=sCZJblyT_XM
  [5]: https://www.youtube.com/watch?v=S0mviKhVmBI&t=450s
  [6]: https://www.amazon.de/How-Measure-Anything-Intangibles-Business-ebook/dp/B00INUYS2U