I am very interested in going to college for software engineering. I have created software before in VB.NET, and have always had an interest in software and computers. My question is, what things are taught in a software engineering class, and what languages and other things should I learn/do to be prepared for the class? #computer #software #software-engineer
What gets taught will vary widely based on what type of school you attend and what course work you take. But some things you should expect include:
Freshman / Sophomore Year
- Math, Science and Logic - a BS program will probably include Calc I, II and discrete math. Possibly stats. A BA program will probably only be Calc 1.
- Basic Computing - schools can't assume you know anything about computers so this is laying down a foundation
- Basic Programming - probably in a language like Java or Python.
- Basic Algorithms and Data Structures - the big ones. Lists, stacks, queues, trees (balanced and not), basic graphs, sorting and searching.
Junior / Senior Year
- More math and science - probably through Calc III. Stats if you didn't get it earlier.
- Programming Electives. Operating systems, compilers, graphics, data, analytics, etc. This is where you will have more freedom to pick your own topics
- Senior projects - many schools require these
- Internships - this is the whole point of the previous 2 or 3 years. Seriously. It is.
Pick a few schools and look at their course work by semester. Here's NCSU's breakdown for computer science:
This should give you an idea of what is coming.
If you really want to get ahead of the curve I would not worry about things like learning more programming languages or website design or the hot new thing. Start with the fundamentals. Those transcend language and hotnewcoolness. They teach you how to think. They lay a foundation.
Try this in the language of your choice. If you want me to suggest one - I suggest Java or C#. You don't need to know very much of the base language to do these things.
Data Structure Basics:
- Create a linked list class
- Implement a Stack and Queue using the linked list as the underlying storage
- Create a binary search tree
- Create a set class using your binary search tree. Implement union, intersection, difference and symmetric difference algorithms
- Implement bubble, selection, insertion, merge and quick sort. Really take the time to understand how they work and in what case you might want one or the other.
- Implement binary search over an array/vector.
- Implement the Boyer Moore string matching algorithm
For each of those 7 points make sure you understand the "Big-O" order of everything. Understanding operational complexity is the thing that matters.
If you went into your freshman year knowing these things then you will know more than what many people remember 10 years after college.
Robert gave a great overview of what pretty much any Software Engineering program will be like. However, if you really want to prepare for being a software engineer (instead of preparing for the classes) I'd recommend focusing on the really important concepts they don't spend a lot of time on in school.
I would recommend spending time getting familiar with using version control, continuous integration tools, writing unit and integration tests, learning about code coverage, and treating your school projects like a system that needs to be designed in an environment where you're not the only one working on the code. This means clarifying requirements, noting assumptions, writing clean code, commenting your code, planning on paper/whiteboard/chalkboard before you even touch your keyboard.
You won't really need to use any of these concepts in your undergrad degree but they are all crucial to working as a professional developer. Don't worry if this feels overwhelming. You don't need to worry about learning these concepts until after you feel comfortable with what you're doing in classes. But if you ever find yourself thinking that what you're learning is too easy or if it feels like you already know it, spend some time learning about/implementing these concepts. It will pay off in the long run.
Good luck! You've got a fun journey ahead of you!
I would highlight what Kirby said, but focus on version control, such as git, because you can begin using it fairly easily, it makes group coding for a class easier, and every single position in software requires you to know it.