Page 1 of 1
Jobs in Programming
PostPosted: Tue Jun 21, 2011 9:31 pm
by Dante
So as I start to come out of the darkness that is depression, I'm considering the task of getting a job ^_^. While I could go out and try and grab a job working in the science industry doing lab work, I'm kind of leaning away from jumping back into science at this juncture.
Majority of my graduate career focused around programming, from graduate courses in numerical analysis, I designed code to solve abstract algebra problems, my final optics project involved optimization theory combined with code, I had courses in MatLAB and Labview (Graphical programming language), spent a year and a half developing code for spectral element method partial diff-eq solver for a 1-D quantum mechanics problem in Python and finally I was responsible for developing all the code responsible for analyzing the data from our ice lab (about 75-100 pages of code in 3 programming languages, IDL, C#.NET and MatLAB).
Over the last four years, I've gained experience with C#.NET (Favorite), Java, VB.NET, Python, IDL, HTML, CSS, MatLAB, Labview and dabbled in C++. As a consequence, I've come to have a fairly strong background in background in programming, particularly when it comes to solving problems that require a good deal of numerical or analytical ability. As a result, it's only natural that I am considering moving into a career in computer programming at one of the local firms in the valley (where I have free housing, family and friends).
Still while courses have taught me a great deal in how to program to solve particular problems, they haven't taught me the ins and outs of the industry. For that matter, I'm aware that my focus is strongly aimed towards computation and while my analytical skill will get me far in solving many problems, I also need to broaden my skills outside of this range to consider various general programming aspects (e.g. multi-core processing, databases access, internet applications).
So what I was wondering, is where do our programmers see this field heading in the near-term future. For that matter, if you've had a background somewhat similar to mine, where did you eventually choose to take your skills?
PostPosted: Wed Jun 22, 2011 7:37 am
by blkmage
I'd say you're in pretty good shape.
A lot of my understanding of the state of the tech industry is basically from years of looking for jobs for internships and talking with my friends who got internships all over the place, both in Canada and the US. I actually just finished my undergrad in CS and pure math and have done some programming in industry, doing database stuff, web development, and test automation. I've always wanted to try doing an internship that was more analytical than systems, but that never worked out. I'm actually going to be starting grad school in September, doing theoretical CS.
Obviously, you don't have the background to do crazy systems stuff yet, but I don't think that's a huge problem if you're willing to do that stuff. Most tech companies want to hire capable people, no matter what their background is, since they expect you to learn. Of course, that's not to say there aren't a ton of jobs already for your skillset, but they won't be listed under things like developer or engineer. Here's a few things that immediately come to mind.
With the rise of social media, there's more and more demand for programmers who can manipulate and extract information from large datasets. This is often called data science but I'm sure there are some variations of the name. But, there are plenty of companies that are looking for people who have the mathematical background and technical skill to do this sort of stuff. Places like Facebook have tons of these people, but other places like Amazon and Google also do this sort of stuff.
Outside of the Valley, there's that whole algorithmic trading and quantitative analysis stuff. The financial system is increasingly becoming dominated by algorithms that do trading, rather than people. These algorithms similarly rely on tons of data and are sensitive to trends that are invisible to people. NYC has huge demand for these people, but I figure that any city with a financial centre or tech industry will have at least some of these firms.
And then there's just straight up research, which is generally in CS, much of which will involve programming. At larger firms, research tends to run across the entire theory-systems continuum. While you might not have the technical background for some of this, but you probably have the research background to make you a plausible candidate. There are small and large (Google, Microsoft, IBM, etc.) firms that publish and some of them also have their research people do some engineering as well, so definitely look into that.
PostPosted: Fri Jun 24, 2011 8:40 am
by Warrior4Christ
I graduated after 5 years of university, and you still have much to learn when you start programming as a job. You look back on things you did 6 months ago and think it looks disgusting and inelegant. So you do learn a lot when you develop software for most of your waking hours on a job.
Know your data structures - get familiar with them so you know what's best in what situation. Get familiar with algorithmic complexity analysis (eg. O(NlogN) kind of thing), and get to know efficient ways to do things (similar to data structures point). Maybe it's just me, but I consider knowing what happens at the low-level important - become familiar with assembly language, get to know the performance costs of calls in higher-level languages, know what it's doing in the background... C#/Java are your lowest-level ones, so it might pay to get more familiar with C++ to be able to do this. (Scripting languages are irritatingly high-level for me...)
Read stuff. Read
http://www.joelonsoftware.com/ (lots of high-quality articles),
http://www.codinghorror.com/blog/ (broader unrelated interesting stuff as well, but also some good stuff), and books -
http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read.
Where are we heading? Heterogeneous computing -
http://channel9.msdn.com/posts/AFDS-Keynote-Herb-Sutter-Heterogeneous-Computing-and-C-AMP. Use the same code to run on CPU and GPU.. or data from the "cloud". Parallelise stuff.
PostPosted: Fri Jun 24, 2011 9:52 am
by Atria35
My mom is a computer programmer. She's been one for all her life, really, so she's going on about 40 years with her degree. Obviously, it's changed a lot since then (you no longer need punch cards to program, for instance). But even she doesn't really know the ins and outs of the industry.
The jobs she had keep going overseas, and there's no stopping it. It frustrates her to no end. Of course, her specialty is programming for insurance companies, always has been, so I'm not sure whether that's across the board or not. I suppose I could ask her to give you some insight if you'd care for it?
PostPosted: Fri Jun 24, 2011 5:07 pm
by Mithrandir
Warrior4Christ (post: 1486864) wrote:I graduated after 5 years of university, and you still have much to learn when you start programming as a job. You look back on things you did 6 months ago and think it looks disgusting and inelegant. So you do learn a lot when you develop software for most of your waking hours on a job.
Know your data structures - get familiar with them so you know what's best in what situation. Get familiar with algorithmic complexity analysis (eg. O(NlogN) kind of thing), and get to know efficient ways to do things (similar to data structures point). Maybe it's just me, but I consider knowing what happens at the low-level important - become familiar with assembly language, get to know the performance costs of calls in higher-level languages, know what it's doing in the background... C#/Java are your lowest-level ones, so it might pay to get more familiar with C++ to be able to do this. (Scripting languages are irritatingly high-level for me...)
Read stuff. Read
http://www.joelonsoftware.com/ (lots of high-quality articles),
http://www.codinghorror.com/blog/ (broader unrelated interesting stuff as well, but also some good stuff), and books -
http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read.
Where are we heading? Heterogeneous computing -
http://channel9.msdn.com/posts/AFDS-Keynote-Herb-Sutter-Heterogeneous-Computing-and-C-AMP. Use the same code to run on CPU and GPU.. or data from the "cloud". Parallelise stuff.
I've been programming for about 25 years now (as a primary occupation for about 15 of that). I'd recommend you re-read what w4c posted, so I just quoted the entire thing. Seriously - read it again. XD
PostPosted: Fri Jun 24, 2011 7:20 pm
by Warrior4Christ
Mithrandir (post: 1486991) wrote:I've been programming for about 25 years now (as a primary occupation for about 15 of that). I'd recommend you re-read what w4c posted, so I just quoted the entire thing. Seriously - read it again. XD
Haha, thanks.
Atria35 (post: 1486883) wrote:The jobs she had keep going overseas, and there's no stopping it. It frustrates her to no end. Of course, her specialty is programming for insurance companies, always has been, so I'm not sure whether that's across the board or not. I suppose I could ask her to give you some insight if you'd care for it?
I would say in general, there's still a lot of demand for software developers, and there'll always be demand for good ones. Just a quick search...
http://stackoverflow.com/questions/3197932/what-kinds-of-software-development-are-in-high-demand
http://www.bcs.org/content/conWebDoc/39052
http://www.workandliveabroad.com/article_item.php?articleid=309
http://www.wikihow.com/Become-a-Software-Engineer
PostPosted: Fri Jun 24, 2011 7:52 pm
by Atria35
Maybe so, but not in her sector, and she's an expert on the older languages- not so much on the new ones. Again, she's been a programmer for about 40 years. But she's also facing age discrimination (she's really only a few years from being eligible for retirement) and there aren't jobs in our area specifically, so that does factor into things.
PostPosted: Fri Jun 24, 2011 8:03 pm
by Mithrandir
Atria35 (post: 1487042) wrote:Maybe so, but not in her sector, and she's an expert on the older languages- not so much on the new ones. Again, she's been a programmer for about 40 years. But she's also facing age discrimination (she's really only a few years from being eligible for retirement) and there aren't jobs in our area specifically, so that does factor into things.
This is a major issue with the computing industry in general - keep your skills up or get left behind. I don't have kids, and it's all I can do to just TRY and keep up with the knowledge. I can't imagine how tough it would be if I didn't have the free time I have. Maybe if I worked some place where we could be on the cutting edge, but not so much where I am here.
PostPosted: Sat Jun 25, 2011 5:14 am
by Atria35
^ Yes, I know that having my brother and I didn't help her being able to keep up her skills. However, she also had worked at the same company for almost 25 years, and even after my brother and I were grown she had literally no free time to do so- they had her working full days and then overtime a few days a week plus most weekends. When could she have gone out to study the new languages? It was a catch-22 for her in that regard.
PostPosted: Sat Jun 25, 2011 7:35 am
by blkmage
I don't know if that's such a huge concern for people entering the industry at this point. Tech companies today are generally really good at cultivating an environment where people are encouraged to keep on learning and providing the time and resources to do so. And I'd say that demonstrated willingness and ability to learn is the thing that employers are looking for more than specific technical knowledge. Obviously, you should seek to have a strong foundation in the basics like W4C mentioned (and they will ask you about these things to make sure you know them), but I wouldn't worry too much if you don't know the ins and outs of some particular field yet.
On that note, you can afford to be a bit more selective with who your employer will be. Check out their corporate culture and see if you fit with the people there. Definitely make sure that they're the type of people that encourage learning more about the field. One of the most enjoyable things about being in this field is that you can always be surrounded by people who love what they're doing and that feeling can be infectious and motivating.
I'll offer a counterpoint too. While I agree it's important to know about low-level details, I think it's more important to have a general understanding of what's going on than drilling it in to your head in fine detail, unless you're going to be working on hardware or things where performance really matters. I also agree that learning C and C++ are probably important, but in the sense that you should know several languages, what they're good for, and when to use them.
PostPosted: Sat Jun 25, 2011 12:52 pm
by Dante
There is some really excellent stuff to digest here - and I'm glad that I have some more work cut out for me. Just to show where I'm going, while I'm considering the job market as a whole, my first choice at the current time would be Go Daddy. It's here in the valley, gains top ranks for employee treatment and it turns out that I may actually know some people inside.
I printed out the MSDN data sheets for some of the structures I'm less familiar with and I will be using these, along with a few good text-books on hand to get more acquainted with their use by studying and more importantly coding them. Given my objective I am basically hoping to focus on C#.NET and ASP.NET.
For the most part, the culture of my educational background has been along the following lines: "A faster program created with low-level language has value, but for most applications in the modern computing environment, development costs far outweigh computational ones. Therefore, software that's easier to code and maintain is more valuable then software that's faster but is difficult to code and maintain." Can't really say how well this applies in practice though on large scale problems.
At NAU, I was given more of a hybrid approach - where I was taught to use Python to code the computationally small problems and then use a call to a C-routine for those portions of the program that were computationally intense (like double while loops over massive arrays).
At the moment, outside of learning more about my weak-spots in the languages themselves, I have also been diving into Sotware Engineering by Sommerville. A lot of places are asking for an understanding of the "Agile Development Process" and this eventually leads into an understanding of this methodology (but is still chatting about iterative and waterfall methods at the current time). I've also made a habit of just coding what I think in the past, so I'm studying up UML so that I can better document and disseminate an understanding of my code to others. Also W4C may or may not be happy to know that I'm working through Introduction To Algorithms, by Cormen, Leiserson and Rivest. I'm considering just skimming chapters 1-4, with a deeper emphasis on 4 because I'm already familiar with the mathematics*. If there was a clearer text out there on the subject matter, I'd definitely be interested in learning about it.
Finally - although it seems un-related, I grabbed a small easy-read textbook on working with groups (did I mention I apparently love to read textbooks ^_^). Throughout college, everything was always about building single monolithic programs on your own. Even in the lab where I worked, I was the only programmer - I taught other future users about the programs but I was responsible for planning, building and testing EVERYTHING. However, I expect that things will be quite different in the work world and I would like to be prepared for it so that I can come in with a happy view of the change instead of a negative one.
All of this sounds like a lot, and I'm not planning on making the big jump for a few more months. By the time I go for it, I have to have myself getting out of bed on my own in the morning and putting in a programming day at home for a while. That way the change isn't so drastic to my life (I'll still be living a healthy life though). Doing this should also grant me a better understanding for any questions they might have. The only way I would change this is if talking with my friends on the inside led to the revelation that I was fully ready now for an entry-level position (possible but I prefer to feel a little more solid before jumping at it on my own).
Anyways, thanks for the advice everyone, I'll be adding some webpages to my bookmarks it seems!
-Pascal
*Graduate Numerical Analysis already went through O-Notation and the various methodologies to determining an algorithms order back at NAU. Admittedly though, I never felt too impressed by it ^_^, because most of the programs there filled up my doubles in about 17-30 iterations - which on a modern computer doesn't give much incentive to program the much much longer but slightly faster version that completes it in 5-12. Both programs will finish even the most obtuse problems I could give them before I could even blink my eyes. But if used as part of a much larger software project, where they were called over and over again, I could start to see where this would add up.
PostPosted: Sat Jun 25, 2011 1:44 pm
by blkmage
CLRS is fantastic. It was my go-to book for interview prep.
PostPosted: Sun Jun 26, 2011 6:34 am
by Warrior4Christ
Wait... just so I've got it right, "the Valley" = San Francisco?
IMHO, I've found Sommerville software processes to be somewhat less relevant to real software teams - they don't really use waterfall in a strict process type, but at my work, they kind of loosely follow the agile process, but not really by the book... it's the kind of thing they'll teach you on the job. It can't hurt to be familiar with them though. Also from what I understand, UML isn't used a whole lot either....
Pascal (post: 1487199) wrote:For the most part, the culture of my educational background has been along the following lines: "A faster program created with low-level language has value, but for most applications in the modern computing environment, development costs far outweigh computational ones. Therefore, software that's easier to code and maintain is more valuable then software that's faster but is difficult to code and maintain." Can't really say how well this applies in practice though on large scale problems.
At NAU, I was given more of a hybrid approach - where I was taught to use Python to code the computationally small problems and then use a call to a C-routine for those portions of the program that were computationally intense (like double while loops over massive arrays).
Yes, there is a high value put on maintainability in real-world software (though there may be an exception in the case of game studios...).
But knowing the low-level details while even programming in a higher-level language is definitely an advantage.
http://www.joelonsoftware.com/articles/ThePerilsofJavaSchools.html
PostPosted: Sun Jun 26, 2011 9:46 am
by mechana2015
There are actually a few 'valley' locations now, one being Washington, mostly near Redmond, and another being the area near San Francisco where companies like Apple and Oracle.
PostPosted: Sun Jun 26, 2011 12:09 pm
by Technomancer
For myself, like Mith said, the important thing is to stay current and be flexible in what you can do. To give you an idea, in the past year I've been (or am) responsible for projects ranging from the development of high-level theoretical concepts in signal processing and neuro-biology to writing middleware for a server application, to writing low-level assembly code for DSPs. So basically, I have to wear all kinds of hats in my current job. And I still really, really need to spend more time keeping up with both the technology as well as the relevant literature.
Overall, I think that the important skills to develop going forward for someone like yourself would involve first and foremost, software engineering / team development. A solid understanding of C++ would also be *extremely* valuable if you wish to stay within your particular specialty (Far too many grad students stick with using MATLAB for their projects, and forget to develop expertise in languages used for actual implementation). I also recommend enlarging your theoretical base to include data mining, machine learning, and if possible optimization theory.
On a more practical side, C++, Java (esp. for Android) as well as .NET will be most useful in terms of working as a software developer.
PostPosted: Sun Jun 26, 2011 11:54 pm
by Dante
" wrote:Wait... just so I've got it right, "the Valley" = San Francisco?
*Smacks head* Doh! No, not San Francisco XD, that shows I've lived in Arizona too long. Whenever they talk about "The Valley" out here, they're reffering to the area around Phoenix. Because it's essentially shaped like a giant bowl surrounded by several mountains, it's referred to as the valley of the sun, or the valley for short. We can't call it Phoenix, because it contains several massive cities side by side. Suprise, Chandler, Glendale, Peoria, Phoenix, Scottsdale, Mesa... cities I don't even know the names of are all connected in one massive unit. Sorry, I can easily see where there could be a misunderstanding there.
Go Daddy for instance is in Scottsdale, or about a good 10 miles away at least of solid city.
PostPosted: Mon Jun 27, 2011 6:22 am
by Technomancer
blkmage (post: 1486394) wrote: I'm actually going to be starting grad school in September, doing theoretical CS.
Out of curiosity, what particular topic will you be studying?
PostPosted: Mon Jun 27, 2011 8:31 am
by blkmage
Formal language and automata theory
PostPosted: Mon Jun 27, 2011 10:38 am
by Technomancer
Okay, so pretty hardcore on the theory side! Moreso than a great deal of potential CS or ECE master's topics for that matter. My own research was geared towards more immediately practical problems (which caused some clashes with my supervisor at the time).
PostPosted: Thu Jun 30, 2011 3:31 pm
by Mithrandir
Wow... TM jumped in on the discussion - sweet! XD
I did a bit of FSA/TM stuff myself. That was fun, but it tends to be less practical than one might expect - unless you've got a sufficiently large problem. For simple things, I tend to just default to switch/case statements and let it go.