Best of luck!
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.
- 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.
- 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.
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
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!
- 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.
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 :)
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.
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.
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.
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.
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
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!
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.
If you're taking an advanced class, make friends with the quiet students, and believe everything they say.
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.
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.
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!
https://letterstoanewdeveloper.com/
You might get better answers if you were more specific with your question, though.
cheesy but golden at the same time
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