Poll: Help me pick my electives (computer science)!

axlryder

victim of VR
Jul 29, 2011
1,862
0
0
Okay, this is may or may not reveal what school I attend, but that's okay. I trust you guys to not take advantage of that information (possibly against my better judgement). I'd like some feedback on these electives.

Oh, I should mention that I have to pick two of them, so please take that into account.

Here are my elective choices:

Java

mobile development (I can choose IOS, Windows or Android)

advanced app programming or
advanced mobile programming (these two require one of the previous three as a prerequisite)

Web Development

.NET

or

intro to computer security (not really leaning towards this one)

I'm pretty much looking for the most relevant stuff for the current state of the industry, as well as stuff that is relatively rewarding. Whichever one would be most beneficial for a burgeoning hobby in game design is also a plus, though shouldn't be a deciding factor.

Accidentally cut the poll short but I think I got the most relevant ones on there besides web development.
 

Avnger

Trash Goblin
Legacy
Apr 1, 2016
2,073
1,210
118
Country
United States
Graduating CS Senior with a software engineer job lined up and 3 internship experiences:

Topic-wise recommendation
1. Java ===> Cannot be overstated in how important it can be. Java is the primary language employers seem to be looking at.

2. .Net ===> Very close second to Java for industry importance. It'll give you generic C# experience (good for job hunting) as well.

Class-wise recommendation
1. .NET ==> The subject matter is a lot more complex once you delve into its inner workings particularly including the MVC framework (learn MVC-based web development!!!!!)[footnote]It's one of the bigger framework models being used for web dev now. Learn it in at least 1 language. I first ran into it working in Java for an internship and was able to get my second internship developing .NET MVC apps with the general knowledge from it[/footnote] and would probably be more interesting in a class setting

2. Java ==> Much easier to pick up on your own with all kinds of teach yourself stuff available. Java is also a class you could easily take over a summer at a community college (that's what I did for it). If you have any kind of OOP experience, it isn't too hard to learn truthfully. For example, my university teaches C++ as the main language, and the jump wasn't bad at all. Java is actually much easier to work with once the syntax is known.

Other
As far as game design goes? I have no idea. I'd guess Java simply because of how generic and ubiquitous it is, but I've never been interested in or done anything around that area.
 

axlryder

victim of VR
Jul 29, 2011
1,862
0
0
Avnger said:
Graduating CS Senior with a software engineer job lined up and 3 internship experiences:

Topic-wise recommendation
1. Java ===> Cannot be overstated in how important it can be. Java is the primary language employers seem to be looking at.

2. .Net ===> Very close second to Java for industry importance. It'll give you generic C# experience (good for job hunting) as well.

Class-wise recommendation
1. .NET ==> The subject matter is a lot more complex once you delve into its inner workings particularly including the MVC framework (learn MVC-based web development!!!!!) and would probably be more interesting in a class setting

2. Java ==> Much easier to pick up on your own with all kinds of teach yourself stuff available. Java is also a class you could easily take over a summer at a community college (that's what I did for it). If you have any kind of OOP experience, it isn't too hard to learn truthfully. For example, my university teaches C++ as the main language, and the jump wasn't bad at all. Java is actually much easier to work with once the syntax is known.

Other
As far as game design goes? I have no idea. I'd guess Java simply because of how generic and ubiquitous it is, but I've never been interested in or done anything around that area.
Thanks for the advice, extremely helpful. I was leaning towards the two above mentioned classes. If you could, do you have any advice on actually getting an internship beyond learning MVC based web development? My grades are ideal but I've learned pretty much everything I know from my classes and I have no real-world coding experience or interview experience in a relevant field.

Also, how important, in your experience, are grades for internships? I plan on getting an internship next summer (of '18), and I was considering taking assembly language over this summer. Unfortunately, the prof who teaches that is notoriously difficult, and if a C or B will hurt my chances I'd rather not bother yet (unless assembly is somehow relevant to most internships).
 

Avnger

Trash Goblin
Legacy
Apr 1, 2016
2,073
1,210
118
Country
United States
axlryder said:
Avnger said:
Thanks for the advice, extremely helpful. I was leaning towards the two above mentioned classes. If you could, do you have any advice on actually getting an internship beyond learning MVC based web development? My grades are ideal but pretty much everything I know I've learned from my classes and I have no real-world coding experience or interview experience in a relevant field.

Also, how important, in your experience, are grades for internships? I plan on getting an internship next summer, and I was considering taking assembly language over this summer. Unfortunately, the prof who teaches that is notoriously difficult, and if a C or B will hurt my chances I'd rather not bother yet (unless assembly is somehow relevant to most internships).
For grades, a lot of the places I interned at were looking for 3.0+ with a preference for 3.3+. I know for a fact that the tech company I will be starting at has a policy that rescinds the offer automatically if my cumulative gpa drops below 2.8 by graduation.

For internships, having a set of languages that you understand is helpful because most of the initial filtering is done by HR members who don't really understand a ton about the technical details. For example, a particular position might have the HR rep cross anyone off the list if Javascript isn't listed on their resume (completely random language choice there).[footnote]Big languages that I've seen being looked for and/or been asked about (in a rough order): Java, .NET, Javascript, Mobile Dev (ie: Android/iPhone langs), SQL, HTML/CSS, C++/C.[/footnote]

Secondly, make sure you have a couple of big preferably team projects under your belt that you can talk about experiences once you reach the technical interviews. These don't necessarily have to be you programmed a top-100 android app though. You brought up mainly school stuff as your main experiences; did you have to do any large end-of-the-semester or semester-long projects for your development oriented classes (ie: Data Structures or Intro to Programming or whatever)? That's what I went into my first internship with mainly, and they seemed happy with what I was explaining about it. If you're worried about this, doing a hackathon or code-jam type thing is a great experience to talk about; they're relatively common and you only need a small group for a day or maybe 2 to give it a try. Interviewers (also stealing from my brother-in-law who does technical interviews for a different tech company) are mainly looking to see if A) You have the capacity to work with others B) You don't get lost in code longer than 3 lines and C) You can have an understanding of the overall goal and workings of a project while only developing a piece of it.

Third, make sure you understand the process of creating code. That sounds a bit odd, but I'm talking about the design system from starting with Idea A to laying out a general project architecture to implementing the different parts to bringing them together to final release (or submission for school). Things such as the best ways to go about debugging or (in an OOP context) class/interface interactions or unit testing[footnote]This is something that I never learned about at school. It's a relatively big thing in the industry though. Understanding the general idea of it by looking at concept-level documentation of something like XUnit or JUnit would be more than enough[/footnote] One of the most important things that you should know is the underlying ideas of how implementing an idea would work even if you don't know the specifics. An article I had to read for my CS Ethics course describes it as Computational Thinking.

In the winter of 2011, a handful of software engineers landed in Boston just ahead of a crippling snowstorm. They were there as part of Code for America, a program that places idealistic young coders and designers in city halls across the country for a year. They'd planned to spend it building a new website for Boston's public schools, but within days of their arrival, the city all but shut down and the coders were stuck fielding calls in the city's snow emergency center.

In such snowstorms, firefighters can waste precious minutes finding and digging out hydrants. A city employee told the CFA team that the planning department had a list of street addresses for Boston's 13,000 hydrants. "We figured, 'Surely someone on the block with a shovel would volunteer if they knew where to look,'" says Erik Michaels-Ober, one of the CFA coders. So they got out their laptops.


Screenshot from Adopt-a-Hydrant Code for America
Now, Boston has adoptahydrant.org, a simple website that lets residents "adopt" hydrants across the city. The site displays a map of little hydrant icons. Green ones have been claimed by someone willing to dig them out after a storm, red ones are still available?500 hydrants were adopted last winter.

Maybe that doesn't seem like a lot, but consider what the city pays to keep it running: $9 a month in hosting costs. "I figured that even if it only led to a few fire hydrants being shoveled out, that could be the difference between life or death in a fire, so it was worth doing," Michaels-Ober says. And because the CFA team open-sourced the code, meaning they made it freely available for anyone to copy and modify, other cities can adapt it for practically pennies. It has been deployed in Providence, Anchorage, and Chicago. A Honolulu city employee heard about Adopt-a-Hydrant after cutbacks slashed his budget, and now Honolulu has Adopt-a-Siren, where volunteers can sign up to check for dead batteries in tsunami sirens across the city. In Oakland, it's Adopt-a-Drain.

Sounds great, right? These simple software solutions could save lives, and they were cheap and quick to build. Unfortunately, most cities will never get a CFA team, and most can't afford to keep a stable of sophisticated programmers in their employ, either. For that matter, neither can many software companies in Silicon Valley; the talent wars have gotten so bad that even brand-name tech firms have been forced to offer employees a bonus of upwards of $10,000 if they help recruit an engineer.

In fact, even as the Department of Labor predicts the nation will add 1.2 million new computer-science-related jobs by 2022, we're graduating proportionately fewer computer science majors than we did in the 1980s, and the number of students signing up for Advanced Placement computer science has flatlined.


Code.org
There's a whole host of complicated reasons why, from boring curricula to a lack of qualified teachers to the fact that in most states computer science doesn't count toward graduation requirements. But should we worry? After all, anyone can learn to code after taking a few fun, interactive lessons at sites like Codecademy, as a flurry of articles in everything from TechCrunch to Slate have claimed. (Michael Bloomberg pledged to enroll at Codecademy in 2012.) Twelve million people have watched a video from Code.org in which celebrities like NBA All-Star Chris Bosh and will.i.am pledged to spend an hour learning code, a notion endorsed by President Obama, who urged the nation: "Don't just play on your phone?program it."

So you might be forgiven for thinking that learning code is a short, breezy ride to a lush startup job with a foosball table and free kombucha, especially given all the hype about billion-dollar companies launched by self-taught wunderkinds (with nary a mention of the private tutors and coding camps that helped some of them get there). The truth is, code?if what we're talking about is the chops you'd need to qualify for a programmer job?is hard, and lots of people would find those jobs tedious and boring.


But let's back up a step: What if learning to code weren't actually the most important thing? It turns out that rather than increasing the number of kids who can crank out thousands of lines of JavaScript, we first need to boost the number who understand what code can do. As the cities that have hosted Code for America teams will tell you, the greatest contribution the young programmers bring isn't the software they write. It's the way they think. It's a principle called "computational thinking," and knowing all of the Java syntax in the world won't help if you can't think of good ways to apply it.

Unfortunately, the way computer science is currently taught in high school tends to throw students into the programming deep end, reinforcing the notion that code is just for coders, not artists or doctors or librarians. But there is good news: Researchers have been experimenting with new ways of teaching computer science, with intriguing results. For one thing, they've seen that leading with computational thinking instead of code itself, and helping students imagine how being computer savvy could help them in any career, boosts the number of girls and kids of color taking?and sticking with?computer science. Upending our notions of what it means to interface with computers could help democratize the biggest engine of wealth since the Industrial Revolution.


So what is computational thinking? If you've ever improvised dinner, pat yourself on the back: You've engaged in some light CT.

There are those who open the pantry to find a dusty bag of legumes and some sad-looking onions and think, "Lentil soup!" and those who think, "Chinese takeout." A practiced home cook can mentally sketch the path from raw ingredients to a hot meal, imagining how to substitute, divide, merge, apply external processes (heat, stirring), and so on until she achieves her end. Where the rest of us see a dead end, she sees the potential for something new.

If seeing the culinary potential in raw ingredients is like computational thinking, you might think of a software algorithm as a kind of recipe: a step-by-step guide on how to take a bunch of random ingredients and start layering them together in certain quantities, for certain amounts of time, until they produce the outcome you had in mind.

Like a good algorithm, a good recipe follows some basic principles. Ingredients are listed first, so you can collect them before you start, and there's some logic in the way they are listed: olive oil before cumin because it goes in the pan first. Steps are presented in order, not a random jumble, with staggered tasks so that you're chopping veggies while waiting for water to boil. A good recipe spells out precisely what size of dice or temperature you're aiming for. It tells you to look for signs that things are working correctly at each stage?the custard should coat the back of a spoon. Opportunities for customization are marked?use twice the milk for a creamier texture?but if any ingredients are absolutely crucial, the recipe makes sure you know it. If you need to do something over and over?add four eggs, one at a time, beating after each?those tasks are boiled down to one simple instruction.

Much like cooking, computational thinking begins with a feat of imagination, the ability to envision how digitized information?ticket sales, customer addresses, the temperature in your fridge, the sequence of events to start a car engine, anything that can be sorted, counted, or tracked?could be combined and changed into something new by applying various computational techniques. From there, it's all about "decomposing" big tasks into a logical series of smaller steps, just like a recipe.

Those techniques include a lot of testing along the way to make sure things are working. The culinary principle of mise en place is akin to the computational principle of sorting: organize your data first, and you'll cut down on search time later. Abstraction is like the concept of "mother sauces" in French cooking (b?chamel, tomato, hollandaise), building blocks to develop and reuse in hundreds of dishes. There's iteration: running a process over and over until you get a desired result. The principle of parallel processing makes use of all available downtime (think: making the salad while the roast is cooking). Like a good recipe, good software is really clear about what you can tweak and what you can't. It's explicit. Computers don't get nuance; they need everything spelled out for them.

But there's a certain way of approaching computers, something she calls "algorithmic thinking," that she thinks every student should learn. She wants to teach them to break problems down into a series of steps, an approach that requires some theoretical knowledge.

At the end of their education, she thinks students should know, "what the heck is an algorithm and why do I care about an algorithm," she says. "Because if you don't understand that, the fact that you can code something up, it doesn't have the same meaning to you. You're not thinking about that problem the same way."

Finally, don't make landing one of the coveted Google or Microsoft internships into the be-all end-all of your search especially for your first one. I know several people in my graduating class who did 1 internship at say Geico or somewhere then a 2nd with a more regional tech firm then did end up landing a job at one of the brand-name Apple/Microsoft/Google/etc. (I'll be at a smaller tech company but absolutely love it, so those top ones aren't always "the best" imho.)

Edit: Another thought for this thesis-length post. Exposing yourself to a large number of different technologies can be a very helpful thing too. Make sure you broaden your knowledge even if its just at an introductory level to things like databases, web development, unit testing, debugging, code sharing (ie: github/subversion/etc), cloud programming/development. Getting your foot in the door for any type of internship/job is the hardest part, and being able to say 'Yes I have some knowledge of databases' (again random example) will sometimes be enough to get you through the initial filtering by HR.

2nd Edit: You brought up assembly, and I completely skipped over that >_> Unless you're looking to go into a specialized position working with assembly or are looking to go to grad school for CS, it's definitely not anywhere near a necessity. I've never been asked once about it[footnote]To be fair, I did have to take a Computer Architecture class where we learned some[/footnote], and I don't know anyone who does any work with it at all.
 

DoPo

"You're not cleared for that."
Jan 30, 2012
8,665
0
0
Java - as was stated, it's a pretty solid choice. It's one of the top things employers are searching for, so it's not bad to pick it up.

mobile development (I can choose IOS, Windows or Android) - out of the three choices, disregard Windows, and pick one of the other two. I'd recommend Android purely because it's Java based, as opposed to iOS's Objective C, so it'd be easier to learn if you are doing Java alongside it. Objective C looks weird in comparison. But at any rate, don't really let that scare you off - both Android and iOS development will be good choices.

advanced app programming or advanced mobile programming (these two require one of the previous three as a prerequisite) - not really sure what the difference between the two is in terms of material, to be honest. They both sound pretty similar. If you feel like the mobile development is your calling, then definitely take this. But you might be OK with just the entry level stuff and then practice by yourself.

Web Development - I'm not sure if that's an actual course or just the heading for the next bit. If it is a course, then it's not really a bad one. Web development is a bit (in)famous for being easy to get into. And it is. But that also means that a lot of web devs aren't really that good. I'd say a formal course on the matter helps a lot. But also, feel free to skip this if you don't feel like it - as I said, it's easy to get into and a formal compsci education is a transferable skill in the area.

.NET - I'd definitely class that next to Java. Java and .NET (mostly represented by C#) are both pretty big. Technically, it goes ".NET for Windows, Java for all platforms" and often that's exactly the case - assuming the same kind of product, if something is tied to Windows, it'd be in .NET, but if it needs to be on anything else, it'd be Java. That's starting to relax to an extent with .NET going multiplatform but still.

At any rate, C# (what I assume the course will be using) is extremely similar to Java. If you know one, you'd be able to very quickly pick up the other. Learning both side by side will also be easier.

intro to computer security (not really leaning towards this one) - while it is important, it's not that important. You can safely skip it - pick up a book or two on the subject matter and you should be good.

Out of these, I'd class this as

1. Java/.NET - same first rank. You can choose one or both safely.
2. Mobile + advanced - if you feel like going into mobile development. Just the base Mobile dev will also be fine. Choose between Android or iOS.
3. Web development (assuming it's an actual course) - it's easy to get into on your own, but some training helps.

As for Assembly - I'd advise against it. I went to the lectures on it when I was in Uni, even if I didn't take the course, since I thought it's interesting. I've never really had to use any of what I learned there afterwards, though. I'm sure you'll pick up enough assembly to get by without doing a special course on it. It's a really specialised field to go into and I know pretty much nobody who needs it on any kind of regular basis. Some people who are doing C/C++ may get into situations where they need assembly knowledge to examine some compiled code but...even then it's not that often.

If you are looking for something else to pick up to help you rise up against other candidates, then I highly recommend SQL/databases. It's easy to learn and it has enormous application. It's probably one of the most under-taught skills I've seen
 

axlryder

victim of VR
Jul 29, 2011
1,862
0
0
Avnger said:
For grades, a lot of the places I interned at were looking for 3.0+ with a preference for 3.3+. I know for a fact that the tech company I will be starting at has a policy that rescinds the offer automatically if my cumulative gpa drops below 2.8 by graduation.

For internships, having a set of languages that you understand is helpful because most of the initial filtering is done by HR members who don't really understand a ton about the technical details. For example, a particular position might have the HR rep cross anyone off the list if Javascript isn't listed on their resume (completely random language choice there).[footnote]Big languages that I've seen being looked for and/or been asked about (in a rough order): Java, .NET, Javascript, Mobile Dev (ie: Android/iPhone langs), SQL, HTML/CSS, C++/C.[/footnote]

Secondly, make sure you have a couple of big preferably team projects under your belt that you can talk about experiences once you reach the technical interviews. These don't necessarily have to be you programmed a top-100 android app though. You brought up mainly school stuff as your main experiences; did you have to do any large end-of-the-semester or semester-long projects for your development oriented classes (ie: Data Structures or Intro to Programming or whatever)? That's what I went into my first internship with mainly, and they seemed happy with what I was explaining about it. If you're worried about this, doing a hackathon or code-jam type thing is a great experience to talk about; they're relatively common and you only need a small group for a day or maybe 2 to give it a try. Interviewers (also stealing from my brother-in-law who does technical interviews for a different tech company) are mainly looking to see if A) You have the capacity to work with others B) You don't get lost in code longer than 3 lines and C) You can have an understanding of the overall goal and workings of a project while only developing a piece of it.

Third, make sure you understand the process of creating code. That sounds a bit odd, but I'm talking about the design system from starting with Idea A to laying out a general project architecture to implementing the different parts to bringing them together to final release (or submission for school). Things such as the best ways to go about debugging or (in an OOP context) class/interface interactions or unit testing[footnote]This is something that I never learned about at school. It's a relatively big thing in the industry though. Understanding the general idea of it by looking at concept-level documentation of something like XUnit or JUnit would be more than enough[/footnote] One of the most important things that you should know is the underlying ideas of how implementing an idea would work even if you don't know the specifics. An article I had to read for my CS Ethics course describes it as Computational Thinking.

In the winter of 2011, a handful of software engineers landed in Boston just ahead of a crippling snowstorm. They were there as part of Code for America, a program that places idealistic young coders and designers in city halls across the country for a year. They'd planned to spend it building a new website for Boston's public schools, but within days of their arrival, the city all but shut down and the coders were stuck fielding calls in the city's snow emergency center.

In such snowstorms, firefighters can waste precious minutes finding and digging out hydrants. A city employee told the CFA team that the planning department had a list of street addresses for Boston's 13,000 hydrants. "We figured, 'Surely someone on the block with a shovel would volunteer if they knew where to look,'" says Erik Michaels-Ober, one of the CFA coders. So they got out their laptops.


Screenshot from Adopt-a-Hydrant Code for America
Now, Boston has adoptahydrant.org, a simple website that lets residents "adopt" hydrants across the city. The site displays a map of little hydrant icons. Green ones have been claimed by someone willing to dig them out after a storm, red ones are still available?500 hydrants were adopted last winter.

Maybe that doesn't seem like a lot, but consider what the city pays to keep it running: $9 a month in hosting costs. "I figured that even if it only led to a few fire hydrants being shoveled out, that could be the difference between life or death in a fire, so it was worth doing," Michaels-Ober says. And because the CFA team open-sourced the code, meaning they made it freely available for anyone to copy and modify, other cities can adapt it for practically pennies. It has been deployed in Providence, Anchorage, and Chicago. A Honolulu city employee heard about Adopt-a-Hydrant after cutbacks slashed his budget, and now Honolulu has Adopt-a-Siren, where volunteers can sign up to check for dead batteries in tsunami sirens across the city. In Oakland, it's Adopt-a-Drain.

Sounds great, right? These simple software solutions could save lives, and they were cheap and quick to build. Unfortunately, most cities will never get a CFA team, and most can't afford to keep a stable of sophisticated programmers in their employ, either. For that matter, neither can many software companies in Silicon Valley; the talent wars have gotten so bad that even brand-name tech firms have been forced to offer employees a bonus of upwards of $10,000 if they help recruit an engineer.

In fact, even as the Department of Labor predicts the nation will add 1.2 million new computer-science-related jobs by 2022, we're graduating proportionately fewer computer science majors than we did in the 1980s, and the number of students signing up for Advanced Placement computer science has flatlined.


Code.org
There's a whole host of complicated reasons why, from boring curricula to a lack of qualified teachers to the fact that in most states computer science doesn't count toward graduation requirements. But should we worry? After all, anyone can learn to code after taking a few fun, interactive lessons at sites like Codecademy, as a flurry of articles in everything from TechCrunch to Slate have claimed. (Michael Bloomberg pledged to enroll at Codecademy in 2012.) Twelve million people have watched a video from Code.org in which celebrities like NBA All-Star Chris Bosh and will.i.am pledged to spend an hour learning code, a notion endorsed by President Obama, who urged the nation: "Don't just play on your phone?program it."

So you might be forgiven for thinking that learning code is a short, breezy ride to a lush startup job with a foosball table and free kombucha, especially given all the hype about billion-dollar companies launched by self-taught wunderkinds (with nary a mention of the private tutors and coding camps that helped some of them get there). The truth is, code?if what we're talking about is the chops you'd need to qualify for a programmer job?is hard, and lots of people would find those jobs tedious and boring.


But let's back up a step: What if learning to code weren't actually the most important thing? It turns out that rather than increasing the number of kids who can crank out thousands of lines of JavaScript, we first need to boost the number who understand what code can do. As the cities that have hosted Code for America teams will tell you, the greatest contribution the young programmers bring isn't the software they write. It's the way they think. It's a principle called "computational thinking," and knowing all of the Java syntax in the world won't help if you can't think of good ways to apply it.

Unfortunately, the way computer science is currently taught in high school tends to throw students into the programming deep end, reinforcing the notion that code is just for coders, not artists or doctors or librarians. But there is good news: Researchers have been experimenting with new ways of teaching computer science, with intriguing results. For one thing, they've seen that leading with computational thinking instead of code itself, and helping students imagine how being computer savvy could help them in any career, boosts the number of girls and kids of color taking?and sticking with?computer science. Upending our notions of what it means to interface with computers could help democratize the biggest engine of wealth since the Industrial Revolution.


So what is computational thinking? If you've ever improvised dinner, pat yourself on the back: You've engaged in some light CT.

There are those who open the pantry to find a dusty bag of legumes and some sad-looking onions and think, "Lentil soup!" and those who think, "Chinese takeout." A practiced home cook can mentally sketch the path from raw ingredients to a hot meal, imagining how to substitute, divide, merge, apply external processes (heat, stirring), and so on until she achieves her end. Where the rest of us see a dead end, she sees the potential for something new.

If seeing the culinary potential in raw ingredients is like computational thinking, you might think of a software algorithm as a kind of recipe: a step-by-step guide on how to take a bunch of random ingredients and start layering them together in certain quantities, for certain amounts of time, until they produce the outcome you had in mind.

Like a good algorithm, a good recipe follows some basic principles. Ingredients are listed first, so you can collect them before you start, and there's some logic in the way they are listed: olive oil before cumin because it goes in the pan first. Steps are presented in order, not a random jumble, with staggered tasks so that you're chopping veggies while waiting for water to boil. A good recipe spells out precisely what size of dice or temperature you're aiming for. It tells you to look for signs that things are working correctly at each stage?the custard should coat the back of a spoon. Opportunities for customization are marked?use twice the milk for a creamier texture?but if any ingredients are absolutely crucial, the recipe makes sure you know it. If you need to do something over and over?add four eggs, one at a time, beating after each?those tasks are boiled down to one simple instruction.

Much like cooking, computational thinking begins with a feat of imagination, the ability to envision how digitized information?ticket sales, customer addresses, the temperature in your fridge, the sequence of events to start a car engine, anything that can be sorted, counted, or tracked?could be combined and changed into something new by applying various computational techniques. From there, it's all about "decomposing" big tasks into a logical series of smaller steps, just like a recipe.

Those techniques include a lot of testing along the way to make sure things are working. The culinary principle of mise en place is akin to the computational principle of sorting: organize your data first, and you'll cut down on search time later. Abstraction is like the concept of "mother sauces" in French cooking (b?chamel, tomato, hollandaise), building blocks to develop and reuse in hundreds of dishes. There's iteration: running a process over and over until you get a desired result. The principle of parallel processing makes use of all available downtime (think: making the salad while the roast is cooking). Like a good recipe, good software is really clear about what you can tweak and what you can't. It's explicit. Computers don't get nuance; they need everything spelled out for them.

But there's a certain way of approaching computers, something she calls "algorithmic thinking," that she thinks every student should learn. She wants to teach them to break problems down into a series of steps, an approach that requires some theoretical knowledge.

At the end of their education, she thinks students should know, "what the heck is an algorithm and why do I care about an algorithm," she says. "Because if you don't understand that, the fact that you can code something up, it doesn't have the same meaning to you. You're not thinking about that problem the same way."

Finally, don't make landing one of the coveted Google or Microsoft internships into the be-all end-all of your search especially for your first one. I know several people in my graduating class who did 1 internship at say Geico or somewhere then a 2nd with a more regional tech firm then did end up landing a job at one of the brand-name Apple/Microsoft/Google/etc. (I'll be at a smaller tech company but absolutely love it, so those top ones aren't always "the best" imho.)

Edit: Another thought for this thesis-length post. Exposing yourself to a large number of different technologies can be a very helpful thing too. Make sure you broaden your knowledge even if its just at an introductory level to things like databases, web development, unit testing, debugging, code sharing (ie: github/subversion/etc), cloud programming/development. Getting your foot in the door for any type of internship/job is the hardest part, and being able to say 'Yes I have some knowledge of databases' (again random example) will sometimes be enough to get you through the initial filtering by HR.

2nd Edit: You brought up assembly, and I completely skipped over that >_> Unless you're looking to go into a specialized position working with assembly or are looking to go to grad school for CS, it's definitely not anywhere near a necessity. I've never been asked once about it[footnote]To be fair, I did have to take a Computer Architecture class where we learned some[/footnote], and I don't know anyone who does any work with it at all.
Thank you again for the reply. Sorry for the delayed response, I had to study for finals and wasn't sure how long it'd take to respond.

I think I'll be okay on grades if that's the baseline, but I do lack any team projects or even semester long projects. I've gotten through a couple of the difficult set of problems on codingame and that's about it. I'm hearing that breadth of knowledge is key here, but would say being able to code something like fizzbuzz would illustrate adequate depth of knowledge in most languages? Or is that too surface level?

As to the process you were referring to, I feel like you're saying to combine creative thinking, critical thinking and strategic planning? Actually coming up with new ideas for programs was actually one of the main concerns I had when I started coding. I could follow general assignment templates just fine, but when it came to coming up with something new I was stumped. It's definitely a process of growth.

As to the range of technologies, my school is fairly good about that stuff. I have a databases class next semester and we did quite a bit with debugging in my c++ class (which is by far my least favorite thing we've done in). I think they touch on cloud programming in the core curriculum as well. I don't know a thing about unit testing though so I'll have to look into that as well. As to assembly, I'm sorry to say it's a mandatory class. They feel that knowing it reinforces a fundamental understanding of computer science that you don't get with other languages and it makes you a better programmer. I don't know how true that is, as our staff is made up of a few dinosaurs, and I have to wonder how much of it is them holding onto the past.
 

Avnger

Trash Goblin
Legacy
Apr 1, 2016
2,073
1,210
118
Country
United States
axlryder said:
Avnger said:
Snip my stuff
I think I'll be okay on grades if that's the baseline, but I do lack any team projects or even semester long projects. I've gotten through a couple of the difficult set of problems on codingame and that's about it.
I'd take a look and see if there are any 'hackathon' type events near you that you're interested in. Websites like this one are good to look at: https://www.hackevents.co/ Another option would be to see if any of your professors are doing research that you could take part in.

I'm hearing that breadth of knowledge is key here, but would say being able to code something like fizzbuzz would illustrate adequate depth of knowledge in most languages? Or is that too surface level?
For your basic languages, that's pretty much it (when you're going for breadth). Make sure you have at least one language that you're extremely comfortable with and knowledgeable about though, like Java is my strongest followed by C++. Other concepts like databases and networking are more just to have enough of an understanding of broad level ideas.

Database Example:

If Person A walks up to you and says "We're going to be backing our code with an Oracle[footnote]the corporation[/footnote] SQL database," you shouldn't have to go back to your desk and start googling what a relational database is, what a table is, and what a primary key is. If you had to go back and look at syntax like what are the keywords for unique entries or how to do summation, that's fine (unless you applied to be a database SQL developer).

Web App/Networking Examples:

What is REST? What does MVC stand for? What is the difference between HTML/CSS/Javascript?

As to the process you were referring to, I feel like you're saying to combine creative thinking, critical thinking and strategic planning? Actually coming up with new ideas for programs was actually one of the main concerns I had when I started coding. I could follow general assignment templates just fine, but when it came to coming up with something new I was stumped. It's definitely a process of growth.
Pretty close with the thinking/planning. It's less about coming up with the brand new idea and more about once you're given this brand new idea, what then? How do you go from Idea -> Design -> Project -> Testing -> Release? There isn't any singular correct answer here. It's a question of how can you apply your engineering knowledge to get from abstract concepts to physical[footnote]in the software sense >_>[/footnote] product. Can you take the problem: I want to create a website people can upload, store, and share photos to and come up with something along the lines of: I'll need a database to hold photos, a front-end for people to visit, a web server to handle uploads/downloads, etc.

As to the range of technologies, my school is fairly good about that stuff. I have a databases class next semester and we did quite a bit with debugging in my c++ class (which is by far my least favorite thing we've done in). I think they touch on cloud programming in the core curriculum as well. I don't know a thing about unit testing though so I'll have to look into that as well. As to assembly, I'm sorry to say it's a mandatory class. They feel that knowing it reinforces a fundamental understanding of computer science that you don't get with other languages and it makes you a better programmer. I don't know how true that is, as our staff is made up of a few dinosaurs, and I have to wonder how much of it is them holding onto the past.
I feel like assembly might be one of those core requirements for accreditation. One of my classes wasn't solely focused on it, but it was heavily involved. You probably won't ever touch on unit testing (or testing in general) in school, but it's a large part of workplace product creation.
 

TechNoFear

New member
Mar 22, 2009
446
0
0
IME languages are not that hard to pick up, once you have the basics down.

IME you are going to have to learn a new technology / language almost every year of your coding career anyway.

Pick what interests or excites you, be prepared to adapt.

Game development is very competitive (and so relatively low paid).
I find industrial systems just as interesting (and very well paid).
Financials, government and health I found very boring, I never lasted more than a year (but was well paid).

DoPo said:
mobile development (I can choose IOS, Windows or Android)[/B] - out of the three choices, disregard Windows, and pick one of the other two.
MS bought Xamarin, so can code in .NET (using MS Visual Studio) and just port to iOS, Windows and Android.

The Win10 update next year for VR / AR also might be a game changer (as it gives VR / AR mainstream support).

Or MS might find yet another way to snatch defeat from the jaws of victory.

DoPo said:
If you are looking for something else to pick up to help you rise up against other candidates, then I highly recommend SQL/databases. It's easy to learn and it has enormous application. It's probably one of the most under-taught skills I've seen
I am developing some good stuff using ORACLE at the moment. All free; ORACLE database (with SQL Plus) and APEX web front end.

APEX is proving to be a good Rapid Application Development alternative to my usual .NET front ends.