Fog Creek Software
Discussion Board




Confusing times for new developers

I'll be graduating in 2 years with a CS degree, and I need to get my priorities straight. Aside from my studies, I've been picking up good old fashioned Win32 development with C.

My original plan was to learn Win32 API (straight C), then MFC, then ATL and COM.  After I had a reasonable (not expert, but reasonable) understanding of those, I would move on to .Net using C#.

But lately, I've been thinking of scrapping the whole plan and just concentrating on C#. (Keep in mind that enough of my class work is in C/ C++/ Java that I'll continue to be learning and staying sharp in those - although it's all command line).

Since Microsoft is transitioning technologies but businesses will inevitably lag, I'm at a crossroads.  Would it be better to hit the job market in 2 years with:

(a) Solid CS foundations + thin understanding of older platforms + thin understanding of new platforms.
OR
(b) Solid CS foundations + solid understanding of new platforms.

What would you do?

Double-D
Tuesday, June 03, 2003

I don't understand why you necessarily have to trade off one for the other. Work hard, and build up a strong understanding of both.

John Rosenberg
Tuesday, June 03, 2003

Who can tell how things will be in two years. If you are just looking at maximising your job prospects I would get a "thin" understanding of as much as possible. There is time to specialise later. Employers will not expect you to be an expert in anything when you leave Uni anyway (otherwise how can they put you on all those sh*tty  projects that nobody else wants to do?).


Tuesday, June 03, 2003

It really depends on what sort of work you want to be doing:

Do you see yourself building:

GUI apps?
Web apps?
Domain business logic?
Database work / interfaces?
Networking or messaging components?
App frameworks / infrastructure?
Hardware interface / device drivers?
R&D / proof of concept?
all the others I've forgotten?

and are you certain you will be in the Microsoft world?

punter
Tuesday, June 03, 2003

Twas ever thus.

Put not your faith in frameworks or tools but in your ability to use frameworks and tools.

Simon Lucy
Tuesday, June 03, 2003

Double-D:

Why are you so concentrated on Microsoft technologies? Not that there's something wrong with them, but still... Is it really so interesting to you? Or is it only because this you think it'll be the easier to find a job in 2 years?

Old developer
Tuesday, June 03, 2003

John, the point I'm trying to make is that at some pivotal period the law of diminishing returns kicks in with regard to learning older technologies.

If it were the year 2005 right now, and I posed the same question, what would your reply be?  How about in 2010? In 2015? In 2020?

I also don't think the premise that someone can learn a multiple of subjects (Win32, MFC, ATL, COM, and C#) just as well a single subject (C#) in a fixed amount of time is realistic -- especially when the "single subject" entails windows forms, asp.net, web services, etc.

If the tables were turned and I interviewed a student that claimed to learn and develop a deep understanding of all those things in their free time as a college student, I'd think they were full of shit.

Double-D
Tuesday, June 03, 2003

A computer science degree should be about computer science, not about a specific commercial environment.  Its this attitude, not just from students but from employers which perpetuates the mediocrity that is around.

As a pre-graduate student I wouldn't expect any particular experience with a tool or framework from you.  I would expect you to be able to problem solve and apply basic techniques in the solution of that problem.

In every other way (unless you have prior experience), you are a novice and you should take advantage of that.  Don't specialise in a toolset, specialise, if you must, in understanding.

Simon Lucy
Tuesday, June 03, 2003

"Employers will not expect you to be an expert in anything when you leave Uni anyway"

-- As much as I'd like to believe that, it doesn't jive with the job postings I've seen these days.

"Put not your faith in frameworks or tools but in your ability to use frameworks and tools."

-- Yes, but at some point don't you need to practice with frameworks and tools to develop the ability?

"Why are you so concentrated on Microsoft technologies?"

-- I'm not.  Non-MS technologies actually get decent coverage in college coursework. Remember, many academics hate Microsoft, so there's little taught and done with MS technology at university. Many businesses, on the other hand, run on MS.  So it seemed natural to fill out my skills in this area.

"A computer science degree should be about computer science, not about a specific commercial environment."
-- Of course.  But this isn't about my CS studies.  This is about how I spend my free time above and beyond my studies.

Developers are a funny lot.  On a typical jobs thread, they'll bitch and complain about HR drones screening resumes.  Then on another thread, they'll advise against learning anything that'll get you past those drones. Or does it just seem that way?

Double-D
Tuesday, June 03, 2003

Simon, the work that the OP was talking about was stuff that s/he wants to do in her/his own time. Under Grads don't have too much choice about what they get taught but they do have a choice about how they spend their spare time (I spent mine in the bar...)

I don't know. People get criticised because they don't want to learn anything new and then when someone actually shows such gumption they get criticised as well. Jeezus.


Tuesday, June 03, 2003

>On a typical jobs thread, they'll bitch
>and complain about HR drones screening
>resumes.  Then on another thread, they'll
>advise against learning anything that'll
>get you past those drones. Or does it
>just seem that way?

Believe it or not, it -is- different for entry-level.

When you graduate college, you want to work for a company that will teach  (or at least mentor) you stuff, not expect you to "hit the ground running."

Companies that hire new CS grads and ask them to "hit the ground running" get mangled code - because schools don't teach bug tracking, lifecycle models, or version control.

Now, I know in 2003, you are saying "Yeah, but i'd rather work at one of those companies than be unemployed."


Here's my advice for 2005:

1) The econmy will pick up -some- by 2005.  There will be more places hiring.  If you graduate from a school with a good reputation, know C well, know how to network, and search nationally, you shouldn't have too much trouble.

2) Get an internship with a company in town that pays and exposes you to current technologies.  Don't do the self-study-in-free-time thing:

(A) It doesn't pay
(B) Employers can never know if they can really trust it (you said that yourself above)

3) There are basically four kinds of jobs for new graduates:


A) "Computer Specialist" - The "just until I find a real job" job.  PC Tech and Network tech sorta fall into this, but they can lead to sys admin duties.

B) "Entry Level Programmer" - For a software company.  This is what you want.

C) "Entry Level Programmer" - For the IS department of a "Big" business.  This can be a great job too.  To target this market, you'll want to learn Oracle, SQL, DB2, Cobol, and Fortran.  (They may not use Cobol or Fortran, but they will probably appreciate your knowlege)

D) "Entry Level DBA" - For the IS Department of a "big" business.  This can also be a great job.


I'd start thinking now about your niche - and how you plan on selling to that niche.

Good luck!

Matt H.
Tuesday, June 03, 2003


About 3C above:

Lots of schools have ISMN programs that are part of the business department that address these types of issues.

For a CS degree-ist hoping to target that market, a minor in ISMN might really help.

regards,

Matt H.
Tuesday, June 03, 2003

Well, I'm pretty consistent in what I say (for the most part).

And yes I know it was about extra-mural study, it wasn't the desire to learn that I was questioning but the intent.  Take all the opportunities you can whilst you have the generally luxurious facilities of a university and follow your nose wherever you like.

But don't pretend to yourself that its about preparing for a particular career.

Investigate what turns you on, push what is essentially a fairly basic education in CS into areas that can make you stand out as an individual and a job candidate.  Yes use tools and frameworks, but use them for a purpose, don't enter a project in order to learn .NET.  Find something that you want to do, then find (given resources and whatever other constraints you have), and use the best tools and framework for that project.

This is the best time to spread and explore, don't impose artificial limits on it.  When you graduate, to an employer your usefulness is not any particular experience in a specific platform.  No employer, except a bad one, is going to assume that its going to be cheaper to hire you because you spent some time learning a tool, api or framework.

If they're interested in cheapness and early ROI on you then you'd be better off understanding administrative tasks and shell scripting.  But that would be short sighted as well, take the long view.

Don't worry about the first job, if you're lucky it will be interesting, if not remunerative, quite likely it won't be either and it might not be at the next job either.  But if you remain flexible, you continue to learn and explore you will have a far more interesting career than if you constrain yourself right at the beginning.

Oh and spend time in the bar as well.

Simon Lucy
Tuesday, June 03, 2003

I disagree with Simon on this one (I think this is the first time).

Learning specific tools will give you an incredible edge over the other CS grads. Frankly, your CS degree isn't worth very much, simply because there are so many people who hold it. But if you have some knowledge over and above that CS degree, you can quickly separate yourself from the pack.

As for what to learn, .NET and Java. I know that some will say that I'm being a bit aggressive to limit it to only those two, but they represent the vast majority of modern software development projects. If you come to me with C#, Java, and a CS degree under your belt, you immediately go to the top of the pile.

I will also add that learning everything you can about life cycle management and source code control will help a lot. These are two areas that every CS graduate seems to lack and are two areas that every CS graduate should know. For the life of me, I don't see how you can graduate someone without these.

Simon is right that there is more to what you are learning today than a particular framework. But anything you can do to separate yourself from the others is a good thing.

Oh, and reading sites like this is also a good idea. It tells me that you are willing to go beyond what the school is teaching. Assuming that your school is teaching you everything thing there is to know is the first mistake most students make. Congrats for not making it yourself.

Marc
Tuesday, June 03, 2003

By 'reading sites like this' I hope you mean Joelonsoftware.com, not discuss.fogcreek.com. :)

Double-D, my std answer for this in the past was :
Learn C.  Get good with it.  Learn pointer arithmetic. 

Now I'm bullish on:
Learn DATABASES!!  Learn .NET &/or Java!

victim, jr.
Tuesday, June 03, 2003

With two years of school left, here's what I would do:

1. Get internships that involve programming (with whatever language/tools, it doesn't matter), especially over the summer. Do the best work you can because the companies where you intern will be key references and networking opportunities when you look for your first real job. They may even offer you your first real job if you're good.

2. Work on getting the best grades you can. Low GPA puts you at the bottom of the list when people hire college grads.

3. If you have time after that, work on some projects that contribute to your school community. If that involves software development like building a web site, that's great. Tech support and team leadership work can be good too. One of my part-time jobs in college was training other people to supervise the computer lab. It was a good thing to talk about in interviews. Doing work that has a positive impact on your campus shows employers that you're not going to sit in the corner and be an isolated code-monkey.

4. If you're going to do some independent learning, pick something that interests you and develop a good story about why. If you want to learn C#, do that. Whatever you learn, make sure you know why you're doing it beyond "I need to get a job."

Whoever hires you right out of school is going to retrain you anyway. That's how these things are done, because a good team needs a certain amount of consistency. So what you want to come out of school with is a good story about why you're worth the investment.

Beth Linker
Tuesday, June 03, 2003

"I will also add that learning everything you can about life cycle management and source code control will help a lot." - I Agree with with this, but where would be a good place to start? Should he just download some tools and start using them, or can you recommend some good books/articles?

Steve
Tuesday, June 03, 2003

"Low GPA puts you at the bottom of the list when people hire college grads"
It may already be too late. There are some stupid companies that will not even interview a candidate unless he got excellent A level results. Presumably an A in Geography is more important than whether someone can actually develop software.


Tuesday, June 03, 2003

Double-d,

I sympathize with your concerns.  I graduated about a year ago (when the economy was still in the crapper) and had a hard time finding a good job.  I specifically remember thinking: "WHY are all these companies so short-sighted and looking for experience in the EXACT thing that they want to do right now?"  Like you said, all the job postings were asking for JavaBeans or SOAP or whatever random technology they happened to be using at that minute.

Especially when the economy is down, it is true that the hiring is short-sighted, and they don't focus as much on your core CS competency like they should.  So it is true that learning specific skills will let you pick from more jobs in the future... however I don't think they would be the kind of jobs I would personally want.

That said, it is possible to get jobs on great academic performance alone.  So if you have that, good; if you don't, then that might be a reason to beef up your resume in other ways.  Personally I did not have any specific technology skills when I graduated (even my C was rusty), but I managed to get a very good job at a game company after doing a "test-drive" internship first.  I also knew someone who worked there -- that's very important!  Someone suggested building your networking skills.  If your main focus is getting a job, then a little improvement in that area will probably do a lot more than a lot of studying C# or whatever...

To the person who said that a CS degree isn't worth very much because everyone has them, that is pretty spurious.  Not all CS degrees are equal, obviously.  Some are worth more than others.  I think a Masters degree would help to beef up your resume if you didn't get the greatest grades or go to a "prestigious" school.  A lot of the programs are just 1 year now.

Choop
Tuesday, June 03, 2003

Uh, to actually answer your question, I would go shallow... unless you are REALLY interested in one thing for some reason, and you want to learn it regardless of whether it gets you a job or not.  Otherwise there is no use learning something in depth that you may not ever use again.  I never knew I would end up in console game programming, and good thing I didn't spend my time learning current "hot" technologies, because basically they are useless for that.  It is all "core" C/C++ programming, over a wide variety of problems.  So I would say it's better to go shallow and have a wider perspective on what's out there, get a taste for these different paradigms (e.g. Windows GUI programming IS a lot different than most programming done in school).

Choop
Tuesday, June 03, 2003

If you try to allocate enough of your free times properly.. you should be able to assimulate in 6 month: 2 good Win32 C books, 2 good MFC books, a com book, and 2 good ATL books. This includes time for trying examples out and doing some exercises beyond what the book requires of you. Some can do it in less, but 6 month is about right. A friend of mine once got his MCSD for the Visual C++ track in about that time. But if you just want to know just enough to be familiar with it, you shouldn't worry too much about paper certification. I think the investment is worth your while.

Li-fan Chen
Tuesday, June 03, 2003

Write some real software (complete programs) of your own, don't just read books.

I used to interview a lot of programmers, and there is usually a huge difference in both attitude and skill level, between those who actually had written some non trivial programs (and could talk about them), and those who had just read the book or sat in the class following the exercises.

S. Tanna
Tuesday, June 03, 2003

Choop said: "That said, it is possible to get jobs on great academic performance alone."

I have to second that remark.  I thought I got my job at a National Laboratory because of my 2+ years extracurricular work running and open source project (well 1 running, 1+ contributing, whatever).  And how that showed that I had drive, and that I liked what I did.  I asked my boss about it the other day, he said:

"Nope, that wasn't any of it, we pretty much just look at your grades and GRE's (if you've taken the GRE)"

paraphrased, of course.  So keep your grades up, but keep interested in stuff outside of school.  You don't want to be one of those people that can only solve problems with answers (you know the type, asks 200 questions of the professor about the problems, without thinking about what type of answer he would want...)

Andrew Hurst
Tuesday, June 03, 2003

>I Agree with with this, but where
>would be a good place to start?

Read mythical man-month by brooks, Code Complete by McConnell, and Rapid Development by McConnel.

I would also recommend "XP: Explained" or something like that.

Do a school project in .Net with multiple people using visual source safe.  Or use CVS.  Do some web searchs on CVS and VSS.

I know this sounds too easy - it isn't.  It took me until I had about 4 years of experience as a working professional to truely "Grok" good software development - and I'm still learning.  That's with an Undergrad degree, and going back to earn an MS at night.

good luck ...

Matt H.
Tuesday, June 03, 2003

Double-D:
I think you will be surprised when you get out in the real world and see that most IT (and other fields) people are not that good. Do what you enjoy and you'll be happy. If you just want to learn a "skill" go to a vocational school. 

Tom Vu
Tuesday, June 03, 2003

As a recent graduate, I suggest learning one thing in your  spare time and having projects that demonstrate your skills in that area. Also, networking (the people kind) is invaluable, worth more (imo) than your degree when it comes to getting that first job (b/c if you dont know someone, a degree isn't enough to get an interview). And regarding the suggestion to get through 5 or 6 books in 6 months, I agree that it's doable (though it's just barely on the fringe of that area), but it doesn't seem realistic to me. Not if you have friends and want to enjoy college at all.  I also disagree with those that say "get a shallow understanding of everything" b/c of the reason you stated (we need some deep understanding of some abbreviation to get past the HR drones).  Then again, I am also of the opinion that the economy will turn around in this next year, though overall I think IT spending/hiring will not get even close to where it was at any point in the dot com era. Those that I know who have jobs had either good internships (2 summers at IBM) or did knock out jobs on stuff they cared about in their freetime (taking over a search engine for the isu lan, writing a program to use said engine, writing/running a message board frequented by every single geek at isu).  And of course, grades won't hurt.
Anyways, good luck with your studies and pursuits, it's time for me to get back to my mcsd prep book (not for the cert, but b/c it seems like the best way to get up to speed on asp.net).

Tim
Tuesday, June 03, 2003

Hmmm.  This is all good advice, but unfortunately it's all geared toward someone else.

I've already gotten a bachelor's degree in another field and held a career. In that career I have written some small app's and utility scripts to support whatever I was working on. My concern at the time wasn't programming - it was just a tool used to get the job at hand done.  These apps and utilities were typically command line C, VB6 and ASP database apps, etc.  Mostly simple stuff. I held no delusions that I was a "real programmer". But doing these simple apps and utilities to support other projects was 10 times more fun than the rest of the projects. So, job market be damned, I decided on a career switch.

I've spent the last year knocking off the undergrad prerequisites for a masters program, and I'll spend the next 2 years (part time) doing the masters. I do think that with a master’s employers might have a higher expectation that I’ll hit the ground running.

I've kept as running list of applications to develop. Many are just pet projects - fun but no commercial value. The majority of my ideas are for GUI apps - both web and desktop. A few would be targeted toward Linux users. I would probably do these in Java. But the ones that actually have commercial value would be targeted toward Windows users (at least, they've have commercial value if I knew anything about marketing). The target market would be small to medium sized businesses - most of which run on Windows environments.

So, I planned to develop these in the next few years. So, my original goal was to develop a simple app or 2 using Win32, then a simple app or 2 using MFC. Then, for the more complex apps I would tie in ATL and COM where needed. Finally, I would do an app or 2 in C#.

A couple of years ago, I worked through the samples in the first half of Petzold's Programming Windows. Last year, I worked through the samples in a (crappy) MFC book. If I were on a psychiatrist's couch playing the "what's the first word that pops into your mind" game, my reply would be "arcane" for either of these book covers.  I didn't find either particularly difficult, but there's a lot of minutiae to remember with both.  I think if I spent the next two years programming in these - with what little free time I have - I might become decent at them. Not good, just decent. But if I spent the same amount of time focusing on C#, I think I'd become good.

And for those of you who are getting sidetracked from my main question, this is not to be confused with my core studies and focusing on fundamentals - this is ancillary.

Double-D
Tuesday, June 03, 2003

BTW, I might have given some of you the impression of a fresh faced young college student with the phrase "new developers" in the topic title.

I do consider myself a "new developer" since my earlier stuff wasn't "professional grade".

Also, I look at it in light of other new developers. If you're a hiring manager with a team of experienced developers and a product line based on the older MS technologies that will be transitioning to .Net, what do you do? Do you have the new developers learn the old stuff for maintenance activities, thereby putting the stable code in the hands of a rookie?  Or do you have them focus on transition efforts since paying them to learn the old stuff and the new stuff might not be as cost effective?

Double-D
Tuesday, June 03, 2003


It depends.

If I'm a hiring manager, and don't know the technology, my coders will hold sway.  They will tend to hire what they know.

Thus, no one will know .net. :-)

Matt H.
Tuesday, June 03, 2003

Re. your choosing (a) or (b): afaic, Win32 is just another C-style API; and MFC is a not-especially interestingly nor well-designed C++ wrapper around it. Given that neither are especially interesting for academic reasons, then based on the number of jobs that I see advertised I think I'd recommend .NET over the old-style APIs.

Christopher Wells
Tuesday, June 03, 2003

"I do think that with a master’s employers might have a higher expectation that I’ll hit the ground running."

Not most of the employers I've worked for - they usually looked at someone with a masters as being more academic then practical. A few of them wouldn't hire someone with a masters straight out of college - they had to have a few years of 'real world' experience first.

RocketJeff
Tuesday, June 03, 2003

I truly think you should forget about what is going to get you a job and do what you enjoy.  If you do things just to get a job, and you dislike your job, it is going to negatively affect other aspects of your life.  There are companies out there using just about every technology imaginable.

Anonymous
Tuesday, June 03, 2003

You know, during summer, there are always projects going on which need a programmer.  Visit the physics dept and ask around if anyone would like your skills.  You'll likely get a job doing fortran or something; many of these projects are looking to spend their money so as not to get grant reductions.

If you're dead-focussed on Microsoft stuff, I've seen stats depts look for VB skills, as well as public policy schools.  That sounds like it might be boring to me, but who knows.


Wednesday, June 04, 2003

You don't need to learn MFC. But win32 and C is a must. Plz read Joel's essay about leak abstrations and you'll see why.

opera freak
Wednesday, June 04, 2003

Ahhh, my caveat about previous experience applies then.

You're several lengths ahead of anyone else on the same degree already because you have experience, you also probably have common sense.

I'd swap a considerable amount of anyone's specific knowledge of a toolset for a reasonable amount of common sense.

So, I guess it goes back to what you wanted out of your second degree in the first place, what turned you on. 

Simon Lucy
Wednesday, June 04, 2003

If you know the Win32 API well and you know C well, I would skip the whole MFC / ATL / COM area. Instead learn C# and the .NET framework. If you learn these well you get vb.net almost for free, since it's structurally similar to C# and uses the same framework.

I should declare a bias here. I've used C and the Win API for about 6 years and I like it. Although it's low level, layers of extra stuff don't get in the way. The unholy trinity of MFC / ATL / COM are too complicated for me. Also I get the feeling Microsoft have decided they're yesterday's technology.

Bill Rayer
Wednesday, June 04, 2003

*  Recent Topics

*  Fog Creek Home