What Skills Should Undergrads Have?
kramed8 writes "As a student myself, after reading the recent 'Slam' article on Java I really began to be concerned with the path of my education. I am currently attending a small Canadian University as a 3rd year Computer Science and Business student set to graduate next year. What seems to have troubled me from reading the article and user comments is that I do not feel as confident as I want to be in C, ASM and other related low-level programming topics. I was taught C++ in my introductory courses, with subsequent classes using C# or Java. My education has not been particularly difficult or time consuming to get good grades, so I have spent my free time dabbling in topics and languages that interest me (ie Multiple GUI Toolkits, Python, Linux). How can I spend my free time in the next year to prepare to enter the work place with a proper toolbox of skills? From what I have been told, there are more jobs for Java and Data Warehouse development teams compared to lower-level programmers. As an undergrad, what skills should I be trying to attain now to further my employability in the future?"
Parties and Women right? Oh.. forgot this was /.
You can only be young once, but you can be immature forever.
People skills should not be overlooked. It is important you be able to get people to like you.
Those are my principles, and if you don't like them... well, I have others.
Playing a good game of Golf will do more to further your career than most anything else.
Other than that, the only skills you need are
The hard part: once you learn a thing or three, you need to go back and do #1 and 2 again. Forever.
Yeah, right.
Practice saying "Would you like fries with that"
I wish you the best of luck but unfortunately you're going to see a lot of really good answers and they're all going to be right. Personally I would do whatever I like to do but become more robust with it. Knowing six languages on a beginners level isn't as good as knowing one ot two in-depth.
Dedicated Cthulhu Cultist since 4523 BC.
You will likely get both good and bad opinions in response to this question here on slashdot, but my best advice would be to ask this question of employers that you might be interested in working for.
First s learning personal finances will give you an edge on nearly every other student graduating. Know how to balance your finances, plan, budget, etc.
Second is confidence. Confidence in the skills you do have an ability to gain new ones. Have confidence in interviews especially. Confidence enough to demand more sometimes, too. Confidence directly addresses your questions of how to make yourself more employable.
The skills you need and success in life should follow those two. Actual skills programming have less to do with you getting employed than you may think.
Spelling, grammar, basic math, an understanding of economics, and a knowledge of the outside world.
Slashdot: Playing Favorites Since 1997
Learn how the hardware works. The concept of code portability is limited. Compilers on diferent architectures do not always convert intergers, floats and strings the same way. Also memory structure can bite you real hard.
The more you know about what is under the hood, the more likely you are to craft code that is actually portable and that will be useful for more than just one generation of processors.
This should give you a proper outlook on what is important in life. If you still have some time left over, I suggest you learn a foreign language of your choice. Better even - learn two. Or maybe read some philosophy. There is more to being a good carpenter then knowing how to hold a plane.
I would like to die like my grandfather did - sleeping. And not screaming in terror, like his passengers.
Well, you know Java. That's pretty low level. It doesn't even support the functional paradigm (one of the oldest in computer science).
Badass Resumes
To increase your marketability, take as many business/mgmt classes as possible. Also, get a part time job or internship so you can network. Knowing things besides how to code (and building a good network) will likely be the most important factors in you getting a job.
Yes there are alot of those jobs, but many of them will take a skilled programmer of any kind even if they do not have the specific experience in the toolset. With that being said, i believe it is more important to focus on some aspect that you really enjoy more than what you think will make money, especially out of college the better programmers are the ones who did it because they enjoyed it not because they are tailoring their skill set to a particular part of the nerd market.
Ask not what you can do for your country. Ask what your country did to you
Wind.
Dude.
Ice Cream has no bones.
For what it's worth my relevant advice to somebody planning to migrate from student to employee status would be: With great compensation comes great responsibility. (to paraphrase Spiderman, Pres. Kennedy & Pres. Lincoln) In my experience the biggest disconnect between an employer and a fresh out of school developer is that they expect high compensation but often aren't open to taking what an employer bundles with that (ownership, initiative, responsibility, etc). As far as specific topical areas? I think that depends on what kind of developer you want to be. Opportunities seem to exist no matter which environments you choose to familiarize your self with; as long as you have the theory down and aren't looking for a joy ride, you'll can make your way along a variety of paths.
C is definitely a starting point - you need not concentrate on ASM (since C is effectively macro assembler), but get used to memory management and handling basic structures. The functional flow and practices that you learn through requirement in C becomes hugely relevant in higher level languages.
Also, linux or some type of posix-based system. C and Linux go together nicely, and most things for linux are written in C. Get out of the IDE environments as well - they're good tools, but they're tools that should be used after you're comfortable elsewhere. I suggest learning and using vim.
Few people these days in an engineering organization have a good understanding of filesystems and underlying technologies. Someone capable of identifying and handling performance issues in applications are highly valued. Linux and C will force you to learn these things. Do GPL work, join some linux kernel lists - even watching these lists for purely curiosity reasons gives you an excellent method of peer review and gives you a good understanding of how development SHOULD work in an organization, even though it doesn't often happen that way.
.
is experience. Look for a job doing something in the field, do your job well, and get a letter of recommendation.
The article yesterday I think was more aimed at people who don't understand that basics of whats going on behind the scenes. For example, its expensive to convert between formats of numbers (int->double etc), or how to use bitmasks/shift bits.
Knowing how to search the web would be good. You could start by looking for the last forty times that this question has come up on Slashdot.
If you can afford the 'free time' see if you can apply for any internships at different large companies. Or see if a smaller one would take the chance with you interning with them. The price is right for them, and you get to tail someone who's more experienced in the field.
You can also look up some open source projects that need assistance (there are many of them that do) and see where you can help on them. Open source projects are a great way to get experience and critiquing your own skills.
You can also learn these three words:
"Hello. Geek Squad."
There are no loopholes. It's either legal or it's not.
If you want to be a software developer, and don't particularly care in which language, it would be a good idea to do a project in your spare time, in one of the main languages (C++/java/C#) used. Java seems to have the most jobs available, of couurse, that may vary in your area. The thing you need to be getting out of your education is understanding the basics, that transcend all languages. Rhe difference between C++, java, and C# are made to be a bigger deal than they really are. You should be able to program in any of these without to much effort. I think the best advice is to be smart, and take what you read here on /. with a grain of salt, as people here tend to overreact to almost everything.
You're really going to have to teach yourself. Remember the college only prepares you with the basics. If you want to really impress your potential future employers you really need to know the stuff cold. You can't expect some over-paid college prof regurgitating text from a book to properly teach you anything. Join a group, network and get ideas from other people.
While I think you have a brighter future than "Want fries with that" option, the above poster did get one thing right.
What do you *like* to do?
I could not stand to write program code all day long, as it would drive me insane, BUT - for whatever reason, I don't mind writing in php and working with web-based programs. I know there are others that feel just the opposite. So, while you will see plenty of good answers on 'you have to know ' and they will be right, cull it down to what leads you into a career you can enjoy.
I earn pretty decent coin now, but have earned better in past. I just loathed the job. And since this is personal view - As long as you can learn quickly, and don't mind doing good quality work, there will be a job for you somewhere.
One of the biggest things I see when hiring college grads is that while they understand how a computer works, why languages behave the way they do, and what a certain language syntax is, they have very little knowledge of how to actually build applications from initial concept to full delivery. This type of knowledge generally falls into the "Software Engineering" category. Learn how to write and read requirements. Learn how to do formal estimates from requirements. Learn about different software development life cycles. Learn about requirements traceability and testing. Learn about software patterns. A lot of these topics are covered in Masters degrees in Software Engineering, so those are good places to look at for books on it. Here is an example, you can look at the classes to find the books used http://www.cti.depaul.edu/academics/Pages/MSinSoftwareEngineering.aspx
HR departments get lots of resumes. When they look at yours, they're looking for reasons to toss it in the trash.
Your resume has one purpose: get you an interview. It's not a biography or someplace to show off your creative writing skills. If something is on that doesn't fulfill that purpose, take it off!
nunchuck skills, bowhunting skills, computer hacking skills...
I know why you are asking these questions, but I think you are missing an important point. You are looking at college like a vocational school - not a chance for a rounded education. You will do FAR better in the long run if you learn fundamental knowledge in many areas, and not spend a significant amount of time on specific training.
Brett
It depends on what type of job you want, and how good you want to be. Really, it does, and the answer is not simple.
I really feel it is best to concentrate in core subjects during college. It is trite, but nobody cares if you know high level language X, be it Java, Python, Ruby, etc. This will change. Knowing how to program, that is a skill that will never go out of date.
I do most of my programming in a very scientific environment, which requires MATLAB for "quick and dirty" computations, but I have also written elaborate C programs when needed for speed (up to 15 times as fast as interpreted MATLAB code despite the claims of optimizations.)
If I were you, I would learn C in and out, through and through. It will guarantee you skills that you will use for the rest of your life, and you will never be an idiot. The way to best do this is to write moderate sized programs in C. I would take as many high level courses in the college environment as possible, preferably one on Operating Systems, which are some of the most complex programming environments and concepts that you will be exposed to. If you are truly into CS theory, then high level mathematics courses are favorable.
What to program, you ask? Why, the standard lot. Here are some of the coding projects we were given in college.
Hello, World (just kidding.)
The game of life.
The game of animals (teaching navigation of link lists, etc.)
Make a program that plays Connect 4 against you. (basic algorithmic concepts, basic "AI")
Make the above program graphical, for fun (GUI / display concepts).
Write a program that implements the Zip algorithm (Huffman encoding -- not as hard as you'd think.)
If these are too basic for you in C, then I'd try to understand a bit of the linux kernel, or get involved in an open source project. Good luck!
Slashdotter, ID #101. UIDs are in binary, right?
I dont know about on the job skills but apperently girls only want boyfriends who have great skills.... You know, like nunchuck skills, bowhunting skills, computer hacking skills...
The biggest thing I've found in 10 years in the IT sector is that just like in any other career path, networking (and not the cisco kind) will get you further than any other single thing. The old adage that "It's not what you know, it's who you know, and what they know" still holds true. Never burn your bridges, and remember that the people asking you for that emergency favor are people that you might in return need a favor from someday.
Make sure you have a firm understanding and be able to deliver the following words:
"Do you want fries with that?"
If you really want to be a good developer, you have to be able to learn how real people work and how to run a project. That's tough - I'm not sure if anyplace has classes on this. But - everything you write fits into a workflow of some sort, and if you can understand the context in which your stuff runs your software will be better for it.
Project Management is almost a must, esp. since you're in the business program too. Projects that come in on time are better than ones where you have to do a "death march" to the end. They make everyone happier, and makes everyone look good. A good PM is usually the difference between 4 80 hour weeks at the end of a project that fails and a nice, 9-6 project that cruises to delivery.
So, it pays to stay sharp. What do I mean by that?
Simple. I got into the software business because I love learning new stuff... and I will spend the rest of my career doing just that. Everything we are doing will be useless 5 years from now, and we will get to learn a new batch of skills. Sounds fun? Then you might have the right stuff to be a developer.
Individual skills are good... but the one defining skill of a good programmer is the ability to learn.
In Soviet Russia jokes are formulaic and decidedly non-humorous.
If you have a decent amount of free time and good grades, try to get an internship or get involved with some sort of mentor-type program. I did that my senior year of university and was offered a job by my mentor before I graduated.
The stuff you'll learn being exposed to the "real world" is much more valuable then what you learn in the classroom.
Don't wait too long.. usually you need to apply during your junior year for any sort of senior-level internships (at least the ones I remember reading about).
It really depends on what you want to do. If you want to be a DBA or a high-level programmer, I'd say you're on the right track (though, low-level code experience will make you a better high-level programmer). However, one thing I see lacking, amongst programmers I work with, is a real understanding of the platform they are developing for. I am kind of in an odd position where I'm programmer 50% of the time, and server admin the other 50%, and I see lots of instances where having more OS-specific knowledge would make the developers more effective. I think the same is true for databases-server products. I'm shocked with developers don't know general Windows OS stuff that all desktop support entry-level techs do. I've seen professors write dissertations on neural nets and call tech support (my first job) with the most assinine questions about how to configure Eudora.
I think the converse is true as well, if you are a server administrator, being able to look at developer's code when windows flips out or you run into a performance issue makes a huge difference. (e.g. is this process slow because someapp.exe is single threaded, or is it slow because it is multi-threaded but generating many-many inefficent threads.)
By your 3rd year of university, you should probably have at least a general direction toward what you want to do, so I'd say pick coursework that will work toward that goal, and if possible, pick up a complmentary course or two in System Administration and Oracle (as most folks can figure out MySQL/MSSQL if they have some SQL knowledge, but Oracle experience translates to dollars as most less folks have less training or self-taught experience with it.).
Forgive my spelling from time to time. I'm often posting during short breaks.
If you are thinking of technical skills only, then a deep and thorough understanding of relational databases in both theory and practice will serve you well. If you haven't already taken a class in Engineering Probability, that too. And take some 300 level classes outside the CS world (say, Mechanical Engineering) so you get some experience in solving problems that aren't within your comfort zone.
Outside of technical skills, political theory through the 300 level, some literature, and economics through the 300 level will be of more value to you than additional programming languages when you are in the 30-50 age period.
sPh
I live in a place where the computer industry is doing well, and programmers seem to be in high demand, admittedly. But I'm also a Jr. in CS right now, and here's what I've observed so far between my own job experience and those of my other friends in school: Find something you enjoy and do it well. One of my friends got into ASP and C# real heavy, and is now the lead dev of a team working on his university's intranet. I'm very detail oriented, and got a job documenting an undocumented system, for which now I'm pretty much the sole dev type person around here, and I don't think they would dare to fire me, even though my school schedule's a pain in the butt. The point is, there is such a plethora of work available, you won't know ahead of time what you need. You just need to get all the experience in _something_ that you can. You'll find a way to use it, somewhere, sometime. If you learn it, they [jobs] will come? Good luck!
Of course during those 7 years, there will be 7 years of new knowledge and technique produced.
So it is almost impossible to catch up and be equal to those already having spent 10 years acquiring the skills and knowledge.
So there will always be a declining number of advanced cross discipline IT technical professionals.
The other thing is that technology changes weekly so fast much of it cannot be taught from a text book or university curriculum and theory doesn't always fit reality.
The good news is those that come after you, may never catch up to you.
The real education comes from direct experience, in doing.
There may be exceptions to the above but in general I think it is accurate.
"an infinite player that has lost his finite mind" ~Infinite Play the Movie (it blends with reality)
If you have no real-life experience, you will join the legions of other just-out-of-college programmers that have no practical skills or real knowledge. The answer is to write programs RIGHT NOW that you think are important, fun, useful, marketable, etc. Join another project if you want, but whatever you do, it needs to be something you can be passionate about. The more experience you have with real products that people use, the better. /self-taught programmer with college education. The self-taught was worth 10x the formal education.
Unfortunately, "being a programmer" is about like "being a medical professional." There are all sorts of functions in the realm of being a programmer that require wide varieties of skills and no one person will have them ALL. So just as in the "medical profession" where you can be anything from a nurse to a brain surgeon, a pharmacist to a psychiatrist, you simply need to choose the skills that match your goals.
If you feel that your foundation isn't as strong as it should be and you feel like you're missing out on something because you have to experience in writing assembler or some other low-level language, then you should at least satisfy your curiosity so that you know what it is and all that. (But I warn you, if you mess with assembler, you will find that the "magic" that computers run under will disappear and you will doubt your machine a lot more than you ever have in the past... it really spoils things for you.)
But as far as I can tell, if being marketable is what interests you, do not put anything but relevant skills on your resume. "Overqualified" will not pass well through "HR" department filters and "too many skills" makes people doubt that you know any of them particularly well. Are you Indian or Pakistani? If not, things are not getting any easier or better.
hygiene and social skills. practice them and you'll be in the top 10 percent in managements eyes regardless of your technical skill.
Pole dancing maybe?
No, just kidding. Me thinks 'Safety Cap' is quite right stating;
1. The willingness to admit you don't know jack, and
2. The desire and commitment to learn.
Once you learn a thing or three, you need to go back and do #1 and 2 again. Forever.
"As an undergrad, what skills should I be trying to attain now to further my employability in the future?"
I'll give you two answers. Both are smart-ass and both a TRUE.
1. Interviewing. Read "Sweaty Palms" by Anthony Melody.
2. Learn how a computer works. Dimes to donuts nobody's made any attempt to teach you this. Read history books on computers. Read about old machines, where systems were simpler. Read older microprocessors spec sheets. Then ask questions about everything you saw. When you understand why people created mercury-delay memory, you'll begin to think about what having memory means, what speed in memory demands, and that will lead you (ultimately) to cache-hit ratios and paging systems. You're probably only learning things which isolate you from how things actually work, and thinking that that's reality. It's not. You'll be interviewing with people who are older than you and they'll know how much you don't. Remember: "Those who do not study history are doomed to not knowing it."
You will, throughout your CS courses and professional/hobby work find out what you really like and you should gravitate towards that. If you are really skilled, then you should be able to pick up what you need to succeed.
That being said, here are the skills I think you should pick up. My only qualifications is that 2.5 years outside of undergrad I am earning $70k+ a year AFTER taxes and have had professional experience on 3 continents(Europe, NA and Asia). Here is the list in no particular order:
1. Pick up a 2nd major. Now of course there are "useful" majors such as science or business, and if that stuff interests you, great, but pick something outside of CS/IT that you REALLY enjoy and go for that. Even if it is film studies. For one, how many chances will you have after college to sit around a bar/coffee shop and discuss whether or not the feds in E.T. represent America's increasing xenophobia after being rattled by Japan in the first real post-war challenge to the US economy?
Secondly, having a 2nd major will catch the attention of recruiters who have to sift through piles of resumes that look the same and can really give you something to talk about at the start of your interview and allow you a pretty good segue into your tech qualifications.
Finally, a second major will allow you to look at problems from a different perspective and help your critical thinking skills, which are in much shorter supply in the IT industry than Java or Python coding experience IMO.
2. Learn another language. Again, there are "useful" languages such as Chinese, Hindi, Korean, Portugese etc., but if you are only learning a language for the money and not because you are interested in the people and culture, you are almost guaranteed to never become fluent. Even languages such as German can help you on the job. If you are working for a company and you and a rival company submit similar proposals for a German contract, and your documentation is in German and theirs English, who do you think is going to win? Plus, from my experience abroad, there is no better way to break the ice with someone in another country than to speak their language. I got a Software Engineering job offer in Connecticut with a small company totally based in Connecticut partially because of my Japanese language skills. The company has to go through a 3rd party to sell their software products in Japan, and they could have really used someone with both a knowledge of the technical side as well as the linguistic side to aid the translators and to double check their work.
3. Study/work abroad. (Shameless plug alert):I found an internship working at an R&D Lab in Japan by working with a group called IAESTE that finds and exchanges internships all around the world. I had to do a lot of work too, for instance I hosted our first intern from Argentina. But after work, there is a lot of drinking! Nothing more fun than a room full of drunk college students from the world over! The internship itself was an amazing experience in terms of both the technical and cultural aspects inside and outside the office. Not to mention I instantly stood out among my peers when it came time for job interviews. It also helped me land the job I have today, working as a software engineer in Germany. Oh yeah, and tons of fun and drinking, cannot stress that enough!
4. Related to the above: work an internship, at home and/or abroad. I also worked in a steel mill writing software, which was a unique experience in itself.
Above all, don't worry about individual technologies. Stay abreast of the news and don't be afraid to dive into something new every few years at the minimum. Oh, and its college, have fun! You have the rest of your life to work your ass off, and you should still work your ass off in college, but the nice thing about college is that for most students, they are young enough to work their asses off AND still have enough energy to go out and party.
Monstar L
You're in school. You will get a job and you will learn on the job. A degree from a University is gonna help a lot in getting your foot in the door, not the number of computer languages you know and how well you know them. I'd love the chance to be back in the situation you're in. Enjoy your time. Don't feel you even need computer related (summer) jobs to gain experience, you'll be doing those jobs for the next 40 years. With good enough people skills and a willingness to learn quickly you should be able to land a job soon enough without spending your free time now learning even more.
Do the things you want, party and have fun. Real life will come along quicker then you think and you'll be kicking yourself for not doing the fun stuff when you had the chance. I haven't had that kind of life for nearly 15 years now and although I don't regret the path I'm on, there are things I know I'm not going to get the chance to do but I had the chance back when I was finishing school...
I made a version of this post in the previous thread, but some form of it should probably make an appearance here as well.
Undergraduate education is not about developing skills, job training, making you a better employee or things of that sort. The proper way to learn new specialized skills (like new programming languages, techniques, or the like) is to either go to a trade school, pick up a book and start teaching yourself, or (heaven forbid) require your employer to train you for the job he wants you to perform. Skills are nice to have, no question. But specific skills are not the goal of an education.
If you want to understand the point of an undergraduate education, look at the overall structure of the program. Notice how the University has a general education requirement where you take a bunch of classes that you thought you had no interest in? Anthropology? Philosophy? Literature? Humanities? Math? Foreign Languages? Okay, keep that in mind. Now look at your chosen major. Notice how it has you take courses from a number of different fields in your chosen major? (I'm not in your major, so I can't tell you what these are, but I suspect 10 minutes with a course catalog would make them clear pretty quickly). When you see this structure, it should be clear that the goal of an undergraduate education is not specialization; it's a degree of educational breadth more than depth.
Why breadth? Part of the belief is that by having a small bit of understanding of a large amount of subjects, you as a person will be better suited for dealing with a large number of diverse circumstances. It's significantly easier to go from your own pet Instant Messenger program project to writing drives for hardware devices if you've at least had some exposure to them before. It's also easier to go from you drivers to writing video game physics if you've taken some physics classes. And it's easier to go from your video game physics to being a lead designer, if you have some background in literature, film, and the like, to provide you with some resources to make a really great game. The assumption in University education is that an individual with a wide breadth of knowledge will be smarter, wiser and more adaptive than a highly specialized individual.
And this gets me back to my previous post about the point of education. The point of a university education is not because it leads to wealth, power, or even happiness. The university as an institution that stems from 2,500 years of intellectual history, dating back to ancient Greek civilization. For the Greeks (and the Romans, and then the Christians, all of who were the champions of education), the goal of education was to make you a better person. For Plato and Aristotle, the goal was that by understanding the world around you, you would be striving towards a form of excellence that is only available to human beings. This was similar for the Romans. The Christians modified it claiming it was to get you closer to God. The point is such that, when your life is examined, it's possible to say "That is a good life."
So, I've rambled a bit, and I don't think I've answered your question. What skills should an undergraduate have? No skill is essential to an undergraduate education. What should an undergraduate have? They should have a wide array of experiences and exposures to different aspects of the world. If you leave your university with this, you may not find a job, but your life is going to end up being a lot better than the guy who's only concern was building a resume.
Trust me, it's going to be huge.
I work with Indians all the time in my line of work, and the one thing they are all in agreement about is that their universities are not as good as ours. They simply don't have the education to compete with us, and if they are American-educated, they typically stay in America. The jobs they are getting are basically the equivalent of junior programmer positions, where they're told which module to write and they write it; or lousy maintenance jobs. There will always be a demand for developers who understand other lines of business (e.g., finance, health care, etc.), can work well with people, and have good analytical skills (for analysis, design, etc.).
Which brings me to my suggestion: learn about other lines of business, because most likely you'll be writing software with actual business users. If you limit yourself to only jobs writing software libraries, you might not have as many options.
Many real world applications need databases. Almost all web applications do.
Learn some SQL. I've never seen a programmer job where Databases skills were a negative.
"Sometimes it's hard to tell the dancer from the dance." --Corwin Of Amber in CoC
Interviewing loads of new college grads, my personal checklist is Competence, Communication and Passion. ( in order of importance ).
Competence : Do you know what you are talking about, when talking about things you should know about.
Communication : Can you clearly express what you do and do not know. No one expects NCG's to know everything, so be up front if you don't know the answer, but try to say how you would go about solving a problem even if you don't know how to do it.
Passion : Are you doing engineering, software / hardware / whatever, because that is the path that was selected for you ? Or do you have some passion for it ? Have you gone beyond the scope of your learning to be interested in the field you are working in?
Many people have the first two qualities, but it is the third one that will set you apart from a field. Any activities or projects that aren't required by your studies show that you have interest in your subject. That can make a difference when deciding between two competent candidates.
There are those that will tell you that C and asm jobs are much more rare than C++, C# and Java. They may be right. I can tell you, as director of Firmware Engineering of the company I'm with, that it is MUCH MUCH harder to find unemployed C and asm 8/16-bit micro engineers than it is to find MSWindows, Linux, big system, C#, java and etc programmers.
My recommendation would be to go to http://www.ti.com/ez430 and for $20 buy yourself a eZ430-F2013. That comes with a MSWindows GUI demo package of a C compiler, assembler, simulator and debugger, with the real TI CPU. With this you can get your hands dirty writing firmware for your own application. It's worth it. It will really enhance your resume going into many lines of work in the embedded/firmware engineer lines of work.
.. Blub falls right in the middle of the abstractness continuum. -- Paul Graham
The number 1 most important skill if you want to have a decent career in IT that won't disappear to South America or India is to be able to speak to business people about IT concepts in their own language. The standard of communication in IT is woeful with the US (IMO) being towards the bottom of the league in terms of the number of IT people who can speak to business people in a way that makes sense to their audience.
The number 2 thing is the theory. Most new technology trends boil down to new applications of well understood theories. If you understand about distributed computing then you know the problem domain and just have to learn the detail of Web Services/REST/CORBA/.NET etc, if you don't know the theory you are stuffed.
Communication and Theory matter. The programming languages don't. After graduating from a good university that gave me that base I went to one interview and said "yes I know C", one week later I had to do a programming test... I had to learn C in that week and still came top out of the interviewees. That was the theory helping. Today however I find more and more that its the communication part that is important both in communicating with the business and explaining the theory to those who don't understanding it within IT.
An Eye for an Eye will make the whole world blind - Gandhi
Nobody hires graduate/inexperienced programmers expecting them to be good; some things only come with experience.
Which is why lots of places don't hire graduates. The ones that do are more likely to be looking for people skills and problem solving than specific experience.
The best CV for a programmer is one with >5 years of directly relevant programming experience on it, in a position of responsibility. You can't compete with that, so don't worry about it. Just do what interests you ... and be prepared to be persistent in the job hunt. Once you get into the game you will hopefully have the opportunity to prove that you're a good bet. After a few years in one job you are much more hirable and can move on if you want to.
At my last interview I was asked the following questions:
...all lies. I had never even cracked open a book about any of these topics, let alone dabbled in these areas. However, I was applying for a job that had nothing to do with these things.
"Do you have experience in cgi?" Answer: yep.
"Perl?" A: sure.
"C#" A: yep.
etc etc etc.
Be sure you are answering questions within the context of the job you are applying for. You are applying for a web design job. Will web designers be familiar with backup utilities? Hiiiighly doubtful, but if you are asked, say yes. You are likely smart enough to figure out any backup tool they sit in front of you should the occasion ever arise. At least, as good or better than any other web developer on your future team.
I did end up doing quite a bit of coding in the languages I just mentioned, but programming is such a simple thing to do, any fool can muddle his way through it. If it's a programming job you seek, just learn the basic highs and lows of all the popular languages, then make it very clear that you have "some" experience with however many languages it is that you looked into. Also make it clear that you can learn ANY language to some degree of proficiency in less than 24 hours, which is a perfectly acceptable amount of time to pick up a new language. They're all nearly identical, of course. A for loop is a for loop... Just syntactical differences in a few cases, which are easily googled in seconds.
Unfortunately for those of us who have been doing it for a long time, programming is no longer the un-tamable beast it once was. These days my 6-year old son writes programs in VB to catalog his Pokemon card collection in one weekend. Tell them you know, even if you don't. Then when you need to apply the skills you lied about, google your heart out and come out smelling like a rose.
Please be sure you understand databases.. the way DBA's do, NOT the way programmers do. PLEASE. I'm so tired of the "Javafication"/"Railsification" of databases. Languages come and go, frameworks come and go, but we have to put up with shit DB designs for years and years.
As one of our instructors back in the Uni used to say - "we don't teach you THE language, we teach you how to LEARN the language". That's pretty much the most important SKILL anyone should master in the college. CompSci or not.
:)
As far as the actual knowledge goes, I have always been of an opinion that a graduate that knows 5 types of balanced trees is worth a bunch of dodos that "know" 5 languages. In the end the CompSci is all about an abstract thinking ability. Therefore the foundation - data structures, algorithms, db principles, grammars, etc - needs to be there and the rest will follow.
Feel free to disagree
3.243F6A8885A308D313
...on big iron. Then I graduated and got a job in web design. (A real job, not "making websites for people I know.") So, I guess... uh... keep your options open?
It is by my will alone my thoughts acquire motion; it is by the juice of the coffee bean that the thoughts acquire speed
Aside from that, study the different OS platforms as well (Linux, Windoze, Solaris, BSD, etc). Even though Java itself abstracts that for the most part, there are still differences in the way it behaves and the tuneability and availability of certain functions on each. If nothing else, it will help immensely when working with an Ops team or when troubleshooting issues that might be platform dependant, and is good stuff to have on a resume.
Tm
Support TBI Research: http://www.raisinhope.org
Invest time in learning a Declarative or Functional Language. http://en.wikipedia.org/wiki/Declarative_programming
Languages like C and Java are Imperative and require a different type of thinking. Imperative languages have proven practical... but articulating algorithms/data structures in a declarative form is very powerful and making a come back.
A declarative language like Haskell may be a good start, even though it likely will not become mainstream. But I'll wager that the things you'll learn in Haskell will make you a better programmer, and will be applicable to knew languages/toolkits of tomorrow.
...stop me if you have heard this one.
A man learns that his very wealthy father is going to die in just a few years. Knowing that he will inherit a fortune, he decides to try to use his wealth-potential to get a wife. After some searching, he meets a strikingly-beautiful young woman, introduces himself, and explains, "In just a few years my father will die and I will inherit millions of dollars!" Impressed, she goes home with him.
A month later, she marries his dad.
My point?
I am a working programmer. I am not going to reveal to you the skills I have aquired which, I believe, give me a competitive advantage against other programmers. Think about that before taking too much advice from strangers on a web forum.
Ok maybe not, but seriously programming in high-level functional languages like lisp, haskell, ML, etc., lets you really explore the abstract nature of computer science. That way you can become a computer scientist rather than just a computer programmer. Concepts like recursion, functional mapping, and—in the weirder languages—lazy evaluation and functional currying are really useful to at least be aware of, and they can help you write more efficient programs in other languages as well. Most helpful for me, at least, is that Ruby supports many of the same functional constructs that exist in Haskell (map, called "collect" in ruby; fold, called "inject" in ruby; etc.). The advantage here is that you can really prototype your algorithms in code and see, conceptually, what they do without being bothered with the nuances of a language like C++, which tends to slow down that process a lot with the constant compiling and mysterious errors.
I was initially taught Java, then C, then C++. When I learned lisp, I never went back. And yes, my pinkies still hurt.
Disclaimer: Watch out, as languages like PHP and Python do not support tail-recursion, a vital requirement for efficient functional programming. Without it, you're stuck with stacks and while loops.
If you want to go into application / web programming, then stick to the high-level Java / C# / PHP stuff. Even though a good proportion of /. seem to be obsessed that you must know about *everything* in a computer, for many programming tasks this is not necessary (else why was high-level programming invented in the first place?), and it's not practical for you to know everything.
Give yourself a project to complete in a particular language and work through it. It's much better to talk about real completed tasks in an interview and it's very useful to have seen things through from beginning to end. You'll learn alot about how not to make the mistake you make on those projects again...
Read about design patterns *and use them*. Being comfortable with a language and how to structure code is very important, they'll be looking for that.
Course, if you're looking to go into embedded or kernel lowlevel stuff then the rules are different, and you should ignore everything I've said...
I spent days upon days in a top-notch CS program learning all sorts of issues in what is being clumped together here on
I'm a big fan of Computer Science and computers and have a masters in the field- don't get me wrong. But the vast majority of the 'professional programming world' isn't computer science. I think Math, logic and the foundations of computation are far more important to understand than whatever particular 'low level' language is 'ubergeek' this week.
Of course, there are exceptions. Want to do Kernel code? Embedded devices? Sure. But if thats not a prerequisite for you to be happy in your career. Meh. Take a humanities course. Read up on the French Enlightenment. Chase after that awesome hottie in the third row back. Enjoy college.
On Java, and on most things,
Should be Research. Knowing how to get the right answers (and not just trusting to an "I feel lucky" google run), or find the right information.
Once you know where to find the latest information, coupled with the theoretical knowledge you've gained through your Uni years, you'll find that you're able to keep current (or at the bleeding edge) of your chosen path, once you've tinkered about with various roles in "The Real World", and found one that fits you.
For further study see my journal,How to succeed in life if you've been unfortunate enough to graduate from college
mcgrew's razor: Never attribute to stupidity that which can be explained by greedy self-interest
I left university 6 mounths ago, and got a very good job before I left. I spoke to the person who employed me, and he said the main thing they were looking for was someone who would fit in with the team. The most problematic people they've had over the past few years have been people who have been anti-social, create code on their own that only they understand, and not be able to communicate with customers and other employees.
Diversify your toolbox of course, but pick on thing and become real good at it.
Look at the want ads. Around here it seems to be almost exclusively .Net. Primarily VB.Net or C#. You can work on whatever you'd like to, but I'm assuming you're interested in learning some skills that have the best chance of landing you a job. Your area may differ in what they're looking for.
Bring on the boos and hisses. It brings me home a very comfortable paycheck and I enjoy my job.
First is understand how to program. By that I mean actually understand how one uses a programming language to command a computer to do what you want. Nothing worse than a "programmer" that can only program in one language because all they learned is that language, and not how to program. If you actually learn how to program, how a computer works, then you should be able to program in any language. You'll have to learn that language's syntax and such, of course, but you'll be able to do that if you need to. You won't be stuck programming in just one or two languages you know.
The next would be learn the MS tools. You might not like Microsoft, but you have to accept that they are a major force in the industry and that you may end up with a job developing for Windows. Learn Visual Studio and be comfortable with it. Be able to write a basic program in it (it makes that pretty easy).
However, learn non-MS tools too, GCC or something like that. Don't be one of those programmers who can only write code if there's a nice development environment holding their hand. Even if that's what you mostly want to do, designing GUI apps for Windows, you don't want to be a fish out of water if there's a job that calls for you to write some code on a server using nothing but a text editor and a compiler.
Do those things, and I think you've got as good a general skills as you are going to get for an undergraduate type of education. You can't expect to master everything, and they'll always be jobs with particular requirements. Best thing you can do is get a good set of fundamental skills so you can be flexible and learn what a specific job requires.
I'd try to learn one of the container environments and web development frameworks, just to show that you can. Tomcat and Struts would be good. Try to do a project for a charity using one of these environments, which demonstrates a lot of good things to a prospective employer
.Net. Like it or not, that drives a lot of work these days, and even knowing why or why not you'd like to use it will be good.
I'd get familiar with
I'd read about XP and other agile methods, and mybe some of the older texts, such the Mythical Man Month, DeMarcos' Controlling Software Projects, and Code Complete.
I'd take economics and accounting, if you think you want to work in environments that handle money. If you want to do device drivers, then maybe not so much.
Last, I wouldn't worry about it. The fact that you're asking this question probably indicates hat you're the kind of person who will do well.
I was taught to respect my elders. The trouble is, it's getting harder and harder to find some.
Please, do not feel that you're wasting your time, but just be aware that your education is not done, you'll have more stuff to learn as you go along, and as long as you are having fun, you'll not mind.
Vi havas e-poston.
-
Take the time to learn about relational databases. Not just SQL. Learn why there's a relational model and why it was developed (yes, pedantic shitheads, there is no widely available pure relational database; eat a dick). Learn what normalization is. Also, shoving everything into the database isn't always the best idea, and some stuff doesn't need a db behind it.
- Learn to work with an SCM -subversion, CVS, whatever. Understand branching and merging, and how you'd maintain a product over time. It's handy and there's tons of developers that have worked for years and don't get it right.
- Don't try to optimize stuff up front. The algorithm you pick typically doesn't have to be the fastest, nor do you have to do everything the most efficient way the first time around. Do something that's clean and easy to make changes to. That's an art, and it takes practice. Too often, I see people worry about making things fast before making them right. Don't do that.
- Learn how to do testing. Not just quickly clicking through shit. Learn to be through, use unit testing when appropriate.
- Do the simplest thing that could possibly work. Don't add features for the future, etc.
There's plenty of other stuff. Don't depend on code generators, don't try to use every single new thing that comes down the pike, XML doesn't belong in 95% of the places you find it, most of the time the programming language you pick doesn't make that big a difference, etc. I like people who understand how to use Unix shell tools, mostly because you can get some simple tasks done quickly by stringing them together.The best class would be a hybrid class where they get people wanting to major in business together with students in CS and they do a god damned project together.
I was very good at college programming courses, only to get tossed into the "real" world where everyone does projects doing things that no one even approached having to do in an honest to God working environment.
My ability to write a house emulator using X10 using Python on Linux was a FUN project but had no real world applicability.
What should be done is get a group of business majors who approach their IT department from the point of view of their "client" their "Client" being the business classes instructor who never talks to IT directly except through scheduled phone calls.
The business majors spend a period of time getting project requirements together, and during this period of time technology on how to approach the known problem is taught in the class on the IT side(takes first half of the semester), as well as meetings with the business group (possibly last 20 minutes of every class) to soften the overall proposal, discuss layouts, designs, feasibility etc...
Then the second half of the semester the functional requirements and implementation stage for the program done by IT while the business group sets up meetings with the client when requested as well creating documentation of the work and trying to stop scope creep.
If done right you could implement the completely dysfunctional work environment that people have to work in every day, and get a product that meets most of the requirements out the door by the deadline. The teachers would grade on work done, how close to requirements it met, then grade on the following basis.
The "client" (business teachers) score would mean 20% of the overall grade of the IT group after reviewing performance reviews from the business students and IT documentation created for him to see, and 80% of the business students based on their performance and responsibilities, and IT instructor would give 80% for the IT students based on their code, cleanliness and following of some standard, and 20 % on reviews by the IT students and documentation provided to the IT students.
This way both groups "grade" each other.
Another good class (say part 2 of this thinking) would be having the students do a series of "real" upgrades and code management of legacy systems that people want to add features too.
if they could pass both of those then they are ready for the regular grind of work.
If you don't vote, you don't matter, so don't waste your time telling me your opinion
While you can get a good overview of the languages/tools you will use in the real world (what's that?) It seems to me that only by getting a job out here in said world will you really get the skills you need. Tinker all you want, every little bit helps, but very little I learned as an undergrad really prepared me for the corporate world. The whole 'college teaches theory, not application' is pretty accurate in my opinion. College (and school in general) tends to have a curriculum that's a mile wide and an inch deep. Lots of subjects covering very little in depth. I certainly think you should go with what you enjoy the most, not where the money is. I've found I'm a much happier person in a job I like making less money than getting 6 figures thrown at me and hating the job. If you don't enjoy what you are doing, none of your skills will matter much, as you'll be less interested in really using them.
My biggest 'wish list' item for undergrads, especially in an IT related field, is a little more concentration on public speaking and people skills. Being a geek really is its own culture,but that doesn't mean you have to be a social retard. I've seen many a great coder fired for lack of tact/ability to dress properly. I think this is becoming a little less of an issue, but that's still one of my pet peeves.
College can only get you so prepared for ANY field, the rest is a trial by fire. Be confident in what you DO know. Just out of school, don't oversell yourself to prospective employers, and you should be just fine.
Pax Vobiscum
Take as many development internships as possible. It doesn't matter how little the pay you. Take them. It's job experience that you can start out with that a hiring manager will look at your resume and go "ah, this guy isn't just a worthless, theory-ladden undergrad."
You'll learn a lot of skills that way, and you might get paid to do it. Chances are, you'll learn a lot of basic skills that are applicable to your job market.
This is the advice that I always give to people who are going to be graduating. Look at the skills that employers want where you plan to live. It doesn't matter whether you can code the best embedded systems in C and ASM on Earth, if there are no jobs for that where you want to live. If you want to get skills that aren't purely work-related, then study just what interests you.
Where I live, Northern Virginia, the job market is primarily for Java developers. I don't waste my time learning languages like C++ on the grounds that someday I might need to learn them, when I can quickly pick up the basics when I need to use them at work. I keep up to date on Java for work, and learn Perl and stuff like that for my own enjoyment.
The most important thing you need to know is how to think about complicated programmed systems. They're deterministic and logical, but can be quite subtle sometimes, and appreciating how apparently non-logical behavior can arise from logical rules is extremely useful. Knowing the command-line switches of a specific compiler is nice, but it's not as important as being able to think critically about what's going on in a complicated system, and being able to convey your thinking succinctly in code that other people can read and maintain. Most Algol-like languages are pretty similar, so if you're proficient in one, you can probably shift to another fairly quickly, much more quickly than starting from scratch.
You should probably try to position yourself to take advantage of the coming era of shared-memory multi-processing on cheap multi-core CPUs. Then when that era fails to arrive, you'll have examined the programming problem from two angles, and will have the mental flexibility to deal with whatever actually does happen.
2*3*3*3*3*11*251
Hiring a new grad is both easy and hard.
Easy - You need to have the standard toolkit of skills, primarily the language(s) that we use for development.
Hard - I want to know that you can (and are able to) work on a wide variety of types of jobs. If you only want to do Java work and nothing else, good luck to you wherever you may end up. Versatility (and a WILLINGNESS to do a variety of thing) is critical.
Things that would be useful for new grads is configuration management in large development teams (ClearCase experience is awesome), requirements (requirements tools like RequisitePro and DOORS is valuable), development processes/tools (Rational Rose experience is a differentiator), and an appreciate of the value of quality assurance methods (peer reviews, design reviews, etc.).
Graduate studies isn't a skill, but getting an MSC will give you a leg up in the job market. It will also give you a chance to pick up on a few choice skills you feel you have missed as an undergraduate. A word to the wise: Pick your supervisor carefully! A negligent supervisor can leave you floundering for guidance, hold you up every time you need them to do something for you, and add academic terms to a grad degree. This can cause you a great deal needless anguish, and it is awkward to complain about a bad supervisor once you are at their mercy.
- If you have an opportunity to get a decent internship, do it. If nothing else it'll look good on a resume.
- Learn C/C++.
- Get comfortable using Linux/Unix, at least to the point of being able to write some simple utility/test programs/scripts.
- Take a software engineering class if your college has one available.
- Expose yourself to some SQL and writing web-based frontends in one or more server-side scripting languages (PHP or whatever).
- Get a good grounding in general programming concepts (how computers actually work under the hood, algorithms, data structures, object oriented design, etc.).
- Look at job listings for stuff that looks interesting and see what qualifications they're looking for; explore the related technologies and concepts.
Fortunately I was able to do all of those in college except for the internship.
Also, it's true that college only prepares you so much; you'll have to spend a lot of time getting up to speed.
Arguing about vi versus Emacs is like arguing whether it's better to make fire by rubbing sticks or banging rocks.
As far as first languages go, java is better than some (remember basic or fortran? as first languages?), at least you learn some good programming habits.
...
...
Nevertheless, java as the only language? Better learn to ask, "You wanna fries with that"
That "slam"-article contains a fairly good analysis. You might consider posix-type systems (like Linux), C, C++, math for programmers, formal methods for analysis, design and testing,
In the end, it all depend on you. What do you wish to do with a computer? For some purposes, java is just about perfect. But, only some.
It's ironic... When I was in college ( early 90s ) I must have read the same article, expect then C and C++ were the sexy languages to slam, Java was not yet quite on the scene, and Assembler was still the choice for low-level programming (but fading fast at the time). C and C++ were not formally taught at my school - it was considered a "tech school" language. But the advanced classes used C and C++, so those who were interested learned it on their own. Many classes were taught in Modula-2. Now THERE's useless text on a resume.
I remember in one class I decided to learn COBOL on the fly, just so I wouldn't have to go back to Modula2, since C wasn't allowed for the assignments. Haven't touched it since then, but aced the class.
I'd recommend 2 things: 1, Learn how to think through how you will do something efficiently, regardless of the language. The hot language changes every few years, so don't get stuck on any in particular. And 2, figuring out some of what you want to do, and spend time doing it; develop skills in areas that interest you, but don't just follow the programming fads of the day. I spent enough time to get through my assignments, but not enough to explore fun areas and get really good at a few things. I could have learned more about the new "world wide web" thing that was just getting interesting; Instead I had to brush up my Internet skills more slowly after graduation, in my (much-reduced) spare time.
Why, oh why, didn't I take the Blue Pill?
Worry less about the languages you'll be using and more about building discipline in yourself to do things the right way.
College courses do well in teaching language syntax and high level concepts. Some schools also push good programming style. However, I find a lot of concepts get pushed aside since they're more important in a commercial environment than in an academic one. These are the concepts that make for a complete software developer.
For example, testing is an afterthought in college courses. The reasoning is sound. You're building an application in a college course that is designed to run once and get you the grade. You don't have to worry about regression issues. It's not an application that will be cause for a 3am phone call on a Sunday morning. Even if testing is covered in the course, the nature of the work you do in that course means the value of the testing will never be realized.
Maybe try this: come up with a software project to build discipline in your development practices. The scope of the project should be fairly small, as the code you write should be one of the least of your concerns. Rather, this should be an exercise in writing tests, managing your project in source control, automating builds (and testing them), and refactoring. Do this and you'll be amazed at how far ahead you are of your peers in a year or two.
With so many different tracks it is hard to say. There is a big difference between writing internal business software and writing software for a company that sells software. I could go on about 50 other career paths besides those two but I am sure you get the point.
As others have pointed out you will likely be doing Project Management, even if you aren't a "project manager" and some skills appropriate to that are worth while to learn. Along with that, so much work is outsourced you might end up doing a lot of Systems Integration as well, where you pull together outsourced projects in to the greater whole of what the business does.
A solid understanding of the basics of straight SQL would be my best advice. This knowledge combined with your data structures knowledge in C++ and Java give you the foundations of what all business software is.
If you want to go in to graphics programming, game programming, or work for a big software company I wouldn't know what to work on. All my work has been with business software internal to the business.
is what I would have learned more about if I had it to do over. How to program using low level network APIs and such. You can't know too much about data structures and how to do things at a low level. It may not help you get a job, but it will help you perform one. Security and cryptography - the basic hows and whys, is always a good thing to know. Personally, I would learn a lot about cartography and geo-spatial databases and algorithms. Applications using such will only grow for the foreseeable future. Best of luck!
Learning more languages is good, and the lower-level, the better in many ways. If you never write code professionally in C, it's still worth knowing. Likewise for Pascal and Assembler (!!!). The real key with more languages is that they eventually fade into different syntaxes and structures, and you cn concentrate on developing the ideas in the language du jour, without worrying about the language itself.
Learn more math. Learn to develop algorithms. LEARN TO TROUBLESHOOT!!! This last is one of the two fundamental concepts that everyone on the planet should know, in their own appropriate context. (incidentally, the other one is quantitative analysis.)
Learn how binary devices work. Build a digital display out of seven-segment LEDs and NAND gates. Write a final-year paper comparing the success of various network protocols, and what makes a good protocol tick. (Actually, that's a neat idea. Hmmm...)
"People who do stupid things with hazardous materials often die." -- Jim Davidson on alt.folklore.urban
Programming is all about 2 things
- problem solving
- for other people
The technical aspect is the first, communications is the second.
As a a low level games programmer, proficient in Assembly, C, C++, don't sweat the small stuff. Actually, I'm a little "jealous" of programmers who grok high level languages like pearl, python, ruby, lisp, haskel, eiffel, and shell programming (I just don't love them like I do C). I like to tinker with the nuts-and-bolts, or bits-and-bytes, but I appreciate those who like to use the more abstract, "higher" languages to be freed from the tediousness of the low level details. Figure out what type of programming you enjoy (high or low), and pursue it. Keep "checking in" what the "other side" is doing, for it will expand your paradigms of programming. If you are a high level programmer, learn as much as you can about the low level. Too many programmers don't understand why their code runs slow, because they have bogged down the CPU in inefficient algorithms and implementations. i.e. virtual functions inside an inner loop.
In the workplace, the most important things are:
- working with other programmers; i.e. respecting the lead's decision, communicating what problems you are having
- when adding new features to existing code, think & beware aware of all the ramfications
- learning to read code, and get familar with a cod base. Most your time you will be _maintaining_ code, not adding in a ton of new functionality.
- spend time with the debugger, learning how to debug
- learn how to become better at estimating tasks.
- Whatever tech you learn in school, is mostly obsolete in 10 years. The details are important for your job, but the general practices are important for your career. You need both.
- Don't forget to have a life, outside from programming.
Hope that helps
A developer that can sit down and talk to a prospective client about their business needs is going to provide a lot more value to their employer in most cases than one who needs someone else to build up the requirements set. I know some very gifted developers who have learned how to really talk to clients, and the pay difference is amazing. We're talking like they're getting paid salaries that'd make you think the dotcom bubble never burst. Why? They're one employee who can do the work of a developer and a business analyst. They can discover the needs, write them up in a way their team can understand, and then work with their team to execute them. Much cheaper than having two employees for the company, who is more than happy to pay bigger bucks to the developer.
If that is a program and it's only 4 years, it's not surprising they might leave some things out of one side or the other.
KLAATU, BORADA, NIh*ahem*
Write an arithmetic expression calculator.
:-/
E.g. compute the value of "2*(3+5*7)".
We used to ask this as an interview question and a disturbing number of
"senior developers" didn't even know from which end to approach it
3.243F6A8885A308D313
Database skills are as important as programming skills. It's hard to write a program of any complexity that doesn't interface with a database. You should be able to design and administer your own major database project (SQL Server, Oracle, IBM DB2) to be more of a complete solutions person.
"It's the height of ridiculousness to say for those 9 lines you get hundreds of millions."
Only three things are certain; death, taxes, and apocryphal quotations - Ben Franklin.
Tech skills get you in the door. Good development and communications skills make you a valuable part of the team, and in the long run they'll mean a lot more to your cow orkers than a laundry list of eventually-to-be-obsoleted technical skills.
Mainframe/UNIX Bit Twiddler and long time Windows/Linux Hobbyist.
The Theorem Theorem: If If, Then Then.
Bo staff skillz. Elite Hax0r skillz.
Turing machines.
As the island of our knowledge grows, so does the shore of our ignorance.
College/ University should hopefully teach you how to learn rather than just give you a finite set of skills. I went to university in the early 80s and pretty much none of the actual skills I learnt there (COBOL, FORTRAN, etc) are of any use to me know.
Engineering is the art of compromise.
Debate anybody you can that is willing and able... I did this in newsgroups, nowadays I guess you have a blog war? I don't know if a similar environment still exists. This was great learning because in order to defend your point you need to do the research to really know what you are talking about. Then just keep taking more outlandish positions that you can still defend and win.
For example, when you say "smalltalk is slow at everything" to in smalltalk advocacy they are going to come back and say "JIT" and "30-bit integers" and a bunch of other hooey. You are going to need to hammer back about cycles to test flag bits and which optimizations are not available for dynamically typed VMs -- you need to have already prepared for these counters. And you should have some benchmarks already prepared in case they drop something you don't understand so you can drop a "but in practice" bomb while you work out an angle on it.
Or when you can defend a non-memory protected typesafe operating system (ie a java kernel) as a superior solution over the micro- and monolithic kernels of today. That kind of thing takes knowledge of all sorts of things from mmu, cache lines, data copying, gc, etc in order to pull off successfully. Unfortunately places like slashdot are not suitable for technical debates like that.
This is way more fun and educational than "hey let me learn about X just because it exists" or any class.
The business world is facing an acute and chronic shortage of English programmers. If you hone your English programming skills (the computer science departments at most universities have subdepartments called "English" and "Comparative Literature"), you will never lack for work. English is the one programming language that is not going to go away during your career.
Be able to hang from the ceiling by your lips.
Have gnu, will travel.
I think coders are the next textile workers. The entire US market will get decimated by the global economy except for very closed, security obsessed markets.
You should learn the lowest level possible programming of the most general-purpose computers. That means C and maybe ASM.
Because for one, you need to start your career simply understanding how the computers work that you'll program for the rest of your career. They all basically work about the same, though there are important variants in parallel computing and stream processing, vs iterated procedures against a stack - but those aren't nearly as likely to be a target for your work (for the next 5-10 years, anyway).
But the most important reason is that you have to learn how to learn. Each programming language is a skill that you should be able to pick up in a week, because you will have to. But they all boil down to instructing the computer what to do, eventually in its own terms. Which is ASM. C is a reasonable substitute, because, though abstracted enough from the CPU to be (largely) portable, it's really mainly a really good macro assembler. And most other languages are mostly based on it and its descendants, as are practically all OS'es.
Picking which language to use is dependent on what you want it to do. If you want your language choice to teach you how to program computers, then C and ASM are the natural choice.
--
make install -not war
Specific tools come and go but paradigms stick around awhile. C, C++, assembly, C#, Java, Python, etc. are all imperative programming languages and the concepts in one should be mostly applicable to another. Try to grok a predicate logic language (e.g., Prolog) and a functional language (e.g., Haskell, Lisp, Erlang, etc.). Doing so will let you see programming in an entirely new light.
Spending time with different languages and toolkits is a good thing. However, not all languages and toolkits are worth learning. Rather that trying to learn every toolkit and language, study them to see what makes them unique. Tcl is a great example; it's not in demand but it does things much differently and for a good reason. Ruby is a good language to look at (closures, etc.) and Ruby on Rails is a good framework to look at (convention vs configuration).
Also, try to nail some of the easier technologies. XML is in demand and it's very easy to learn and the related XSL, XSchema, and XQuery languages are easy enough to get familiar with.
If you are more interested in theoretical, talk to your professors and get them to recommend subjects and texts for further study. Parallel programming is an area that will be especially in demand.
Seriously. You're a student, now. You're studying programming. That tells us a bunch of nothing.
What do you WANT to do?
If you want to teach English, you should consider changing majors.
If you want to design circuit boards, you should take some EE classes.
If you want to write high level apps and programs, you're probably doing fine.
You have taken a compiler course, and a circuit design course, right? I think there are some useful ideas in those.
What the hell do they teach, these days, anyway?
But more importantly for you: why the hell are you studying programming?
A lot of the previously-posted non-technical recommendations are really good.
For technical recommendations, I personally think that the most important thing to be a good programmer is to understand the base functioning from top to bottom. That is, you want to understand true computer science -- the mathematical underpinnings, how programs are structured overall, how structured design is compiled into machine instructions, and how those instructions interoperate with the hardware and system software. Two of those -- namely, how the hardware and low-level operating system does things and what the mathematics is -- have served me particularly well.
At first level, you should absolutely have ranks in Bluff, Forgery, Gather Information and Craft (Bong).
Skill points permitting, Balance, Diplomacy, Decipher Script, Sense Motive and Intimidate are useful, but not required.
As you rise in level:
* You can never have too many ranks in Bluff or Craft (Bong), put a point in each at every level.
* By the time you graduate, you should have at least 4 ranks in Spot and Listen. Nothing will actually happen until near the end of Sophomore year, so there is no rush.
* As your living quarters grow increasingly slovenly during your time as a student, more ranks in Search will be required.
* Avoid Knowledge skills - they are useless. Likewise Concentration.
* Disable Device and Open Locks are both useful even with a small number of ranks.
* Use Rope sounds good, but it turns out that you actually won't get a chance to take advantage of it unless you have many ranks in Diplomacy.
* If you take any ranks in Tumble or Move Silently, you will spend the rest of your life as a douchebag.
* If you've read too many novels you may think that Climbing will enable you to go around on the tops of the buildings. It will get you arrested.
Hope that helps.
The good and new comes from no quarter where it is looked for, and is always something different from what is expected.
As many have said before me, nothing beats real-world experience. Everyone will want a different language, and you can't learn them all by heart. Know a few of the big name languages really well and have a good grasp on where to go when you want to learn another language. Plus, try out a few languages that are vastly different from each other. Knowing Java can help you get a grasp of C/C++ early on, but would help you nil with something like LISP, ProLog, PostScript or assembly.
Personally, my first language was C++. Every language I've learned since then, I've asked myself "Okay, how is this like C++ and how is it different?" After graduating, I've had to use C++, Java (heavily), Python, and some strange variation of VB6.
Off-topic: Personally, I don't see how Java is "damaging" to students. True, you don't need a GUI on every program, but I wish I'd had a decent class on how to make a GUI in Java when I was an undergrad. Though, I can't argue the issue of code overhead and hitting the system harder than necessary.
It was one long turd that just wouldn't stop coming out. I feel so light, fresh and clean now! I should try to accumulate and do it again tomorrow :)
Developing your skills as a person is probably the first thing you should work on. Take a management class or participate in a student club or organization, take some time to figure out what your strengths/weaknesses are. Humility: Are you willing to ask questions, Are you willing to admit you don't know the answer, Are you willing to find the answer? Teamwork: Are you willing to agree, disagree, compromise, adapt, and move forward working with people of different backgrounds and personalities? Balance: Are you able to separate work from play, Do you have something else you love besides programming i.e. gardening, outdoors, arts and crafts, recreation, family life? Compass: Can you treat people with respect, Are you a good listener, Would you be willing to do what is right instead of what is easy? Once you have a handle on who you are you can train the programmer. Real experience helps. Don't be afraid to take internships that are unrelated to programming. These may be the people that you will code for. Understanding the user will make you a better programmer. Find something you love doing and find an angle that programming can fix/improve. As an earlier post said nothing beats real world experience. Get the tools and learn how to use them. Use the summer or break to intern or volunteer using your programming skills to stay fresh. Good Luck!
You never know what your job will be from year to year, so there is only so much preparation you can do.
The cool thing is that as a software developer, you get paid for what you're capable of learning on the job, not just for what you already know. Most big companies will pay for any training you need along the way to do your job.
He's right that most graduating students don't know how to budget, plan, save for their toys or balance their checkbook. Learn these BEFORE graduating and practice every month. Keep in mind that budgeting doesn't mean denying yourself. It means making sure that you CAN have the toys/fun you want while staying warm, dry and well fed.
Second is confidence. Be confident that you know what you know. But also keep the willingness to acknowledge what you don't know and then learn it. The phrase "I don't know" is rarely spoken by computer professionals. The phrase "show me how" is even rarer. Keep both handy and you'll be regarded as someone who knows a lot but doesn't seem arrogant. Try not to feel threatened by someone who seems to know more. If they do know more, learn from them. If they really don't know more, others will figure it out around the same time you do.
The only other thing I can suggest in general is to take ownership of your own career. Don't expect your employer to train you or keep your skills fresh and new. That's your job. Also, keep asking yourself "what are you doing this year that warrants a raise from your employer?". If you don't want to pay your cable company more this year for the same service you got last year, your employer feels the same about their developers and administrators. Upgrade the services you provide, then ask for a raise knowing you deserve it.
And lastly, HAVE SOME FUN! LIFE IS TOO SHORT NOT TO.
Hope this helps...
Ididn'tdoitnobodysawmedoityoucan'tproveanything!
Want to be marketable? Learn Hindi or Chinese and study their respective cultures. 'cause that's where the entry- and mid-level jobs continue to go. Also Poland, Romania, Ukraine, and Russia.
The low level programming, especially ASM is the foundation of everything you'll do. The new languages and models are just abstractions for that. If you understand how a computer works, you should be able to pick the appropriate tools at the appropriate time. Also, make sure you communicate effectively and know as much math as possible.
Most high-paying corporate jobs are C# or Java, essentially coding database backed websites but often using lots of buzzwords and acronyms and toolkits and whatnot. The skills that pay the bills are basically: Knowing how to use SQL & databases, and developing in an object oriented language with a large support API. Most corporate work at the end of the day is pulling info from a database and slapping it onto a web page. Learning how to quickly teach yourself how to work with somebody else's code based on nothing more than some simple API documentation (see http://java.sun.com/j2se/1.5.0/docs/api/ and/or Google and approach it from a goal-oriented perspective: How do I sort a list of names? How do I encrypt a credit card number using a standard encryption library?), and understanding basic concepts behind the internet, will pay the bills. Also, read a book or two on 'design patterns' so that it's easier to talk to other programmers and so that you won't constantly be thinking you just invented the wheel.
They'll say all sorts of other buzzwords: in Java, it's Hibernate and EJB and XML and Tapestry or Spring... they're all fancy apis that make your life easier in some way and harder in others and the only school related skill that is relevant to them is being able to learn from a book and/or the published APIs. You expressly do _not_ want your school to give you a degree in one of these things, because they come and go every few years as the Next Big Thing reinvents Smalltalk, again. Instead, learn how to learn them.
Beyond that, learn what interests you. There is all sorts of fascinating fun and specialized stuff to be learned. I know a guy who animates explosions. I know a guy who writes genetic algorithms for game playing. I know a guy who works on an MMO. None of them need a whit of database or web page experience or knowledge for these things, but it's sometimes hard to pay the bills fulltime with the fun stuff, so the database backed websites is a useful fallback. Hopefully you can get into something that fascinates you, but if not, you can always bank a good salary with a day job in the corporate world and tinker on your nights or weekends until you can afford to retire and do whatever fascinates you fulltime.
is competition good, or is duplication of effort bad?
Often the biggest skill lacking in technical people is they cannot write very well.
I've seen some really bad reports written by fairly good technical people.
Spending several semesters taking writing courses is a much better investment than learning a new language (which you should be able to do on your own and which will happen during your career).
Being able to explain things clearly on paper will put you in an important position in any development group and will lead to the most career growth.
I'd probably recommend undergrads prepare for law school, so they have a chance at a decent income for raising a family. Any science discipline such as CS, engineering, etc is pretty much a second class subject these days compared to business and law in the US.
You never see an attorney's job get outsourced, while any tech field is at risk of disappearing overnight.
You also never see someone with an active bar association membership (i.e. not disbarred) unemployed either, while the CS person fresh out of college is filling your coffee cup at Denney's.
He'd better spend some time on specific training. Unless he plans to do graduate work, college is NOT meant for rounding out his knowledge. High school is getting a "well-rounded" education, not college. Perhaps you meant that he should study a diverse set of topics within his major, then I would agree with you. However, if his goal truly is to be as prepared as possible for a job once he leaves school, he should start by looking at the work involved and tracing back the skills from there.
1, 2, 3, 4, 5... That's the combination on my luggage!
The other end of the spectrum is also important and that is system architect problem solving. This means that you have to see a system on a larger scope and not only the lines of code that are written. Many modern systems has to integrate with a lot of different systems using a variety of protocols. The whole range from custom-designed file-based exchange of data using FTP to CORBA with IDL and Web Services with WSDL. And don't forget XSD/DTD/XML.
The more you learn the more you know that you don't know.
If builders built buildings the way programmers wrote programs, then the first woodpecker would destroy civilization.
While assembly language is a valuable skill you core ciricullum should have included a computer architecture class which covers a platform agnostic version of assembly code. If you did well in that class, stop right there. For the last 2 years I have been working heavily with microcontrollers and each has their own flavor of assembly language based on the architecture. If you did well in your class which taught assembly language, wait until you need it to do something, its absolutely pointless to learn a specific architecture otherwise. If your grasp of computer architecture and language theory is strong, it should only take a day or two to pick up a new assembly variant. Don't get me wrong, it is a useful skill. Some platforms have feature rich instruction sets, while others are so utilitarian and sparse it gives them a simple elegance. The most important thing to learn in school is How To Learn. The rest you can pick up as you go.
Remember the most useless things will go well on your resume. Remember to tell you prospective employers that you will need at least 20/hr a week paid time to keep up your social networking obligations.
Also it's a good idea to bring a domestic beer to the interview. Micro brew or foreign beers denote a snooty attitude and do nothing to help fight the terrorists. Old Glory on your cap is an excellent way to show pride.
Also remember bright green Bow Ties go really well with Lederhosen.
Sorry about the writing. Robot fingers, you know? Cliff Steele in DOOM PATROL #23
"... They're one employee who can do the work of a developer and a business analyst ... Much cheaper than having two employees for the company ..."
Is the PM responsible for this guy actually booking him into the plan at 80 hours per week, or just the regular 40 of a single person?
You don't have to be good in assembly but I find it strange that a university doesn't demand some knowledge about it, e.g. a 1000 instructions small project written in assembly. You should even go deeper at the same time and learn simple things about digital circuits. Then you will have some feelings about what actually happens when you write something like int a = 1; I can imagine that somebody can be very good coder without this - but I have't seen such a case :) And it really doesn't require significant effort compared to the timescale of graduating in a univerity.
With the exception of writing low-level embedded software for very specific hardware, most of the programming opportunities out there won't care about low-level hardware/software know-how. A lot of today's jobs involve solving problems with IT/IS solutions and since most companies consider IT spending an expense or liability that should be minimized (rather than an opportunity to spend $1 to make $3) you aren't going to want to be worrying about memory allocation or pointers. Built-in garbage collectors and other features in todays higher-level languages will save you a ton of development time (at the expense of some execution time/efficiency, of course). Spending days or weeks optimizing a program to use 20% less memory or to shave 2 seconds off a 2 minute execution time just isn't worth it to the business in most cases.
Even companies that SELL software are getting more lax on this - desktop hardware is way more powerful relative to most of the software out there now than it was even 5 years ago, there's plenty of room to be sloppy if it means getting the project to market weeks or months sooner.
> There's only one programming language you
> need: Turing Machines
Wash U graduate by any chance?
sPh
If your school offers a co-op program, and its not too late in your education path, take a serious look at doing a co-op program. Nothing develops relevant skills for future employment like actually being employed in a relevant position. Also, speaking from the perspective of a recent university grad myself, I can truthfully say those in my graduating class with co-op employment on their resume were hired quite quickly (usually within 3 months) into a relevant position, whereas myself and a number of others had to jobhunt for the better part of 6 months to a year.
It may sound strange, but I think the most positive influence I had from any classes was learning Latin; not that I can now translate anything more basic than "Marcus et Cornelia in horto ambulant.", but because that thought my neural net to effectively split up one big problem into an number of smaller problems Also learning 8086 assembly language and 'manually' calling msdos calls (int 21h) and bios calls (int 10h) thought me how "to think" like a computer.
Wenn ist das Nunstueck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput.
From what I have been told, there are more jobs for Java and Data Warehouse development teams compared to lower-level programmers.
.NET and SQL will get you a job. But, do
you want to write nothing but crappy VB.NET (or even C#, a small step
up) apps with toy forms for data entry and retrieval?
"More jobs" does not mean "better" or "higher paid". It all depends on what you want.
For the next few years at least,
You could specialize off of that, data analysis has the potential for some fun (not talking about financial accounting here - I mean coding nonlinear trending/forecasting models, which can get into some of the coolest soft-AI techniques out there). You could focus on graphics, work on new ways to present data to users. If you really want to do low-level code, I can tell you firsthand that firmware rocks, will rake in the dough, but it can burn you out quickly (so have a backup plan).
Mostly, realize that you need to do something fundamentally not fun, or no employer would pay you to do it. So, the real work comes from finding a way to make it fun to you. And only you know what that means.
I can't speak generally for the CS industry but, if say you have
the following skills:
1. Excellent math background (note not CS but rather math)
2. Able to read a practical CS paper and implement in favorite language without help
3. Understand processor architectures generically (meaning not only x86 but PPC, ARM,SPARC etc)
4. Know C++ and a dynamic language like Python very well
5. Have excellent written and verbal capabilities
6. Are generally curious about all things not just tech.
Then finding a good/rewarding job will not be hard, that said not
having the above doesn't mean you can't find a good/rewarding job,
it just means you'll just have to search a bit harder/longer.
Arash Partow's Philosophy: Be a person who knows what they don't know, and not a person who doesn't know.
Handling oopses was the biggest skill I had learn when I got out of school. That is both figuring out what went wrong (debugging), and how to gracefully handle errors at run time in systems that can't go down. In fact, I'd like to see some sort of Forensics class be core curriculum for all Engineers because designing a new system is easier than cleaning up a broken one.
- doug
The first 1 or 2 jobs out the door are only going to be a stepping stone. My first one out of college was with CSC they had me running unix commands from a checklist and called the position 'programmer/analyst'. I wrote a gui in TCL/TK that made my job obsolete and I was moved to doing java front ends to an informix database. Within 6 months I was the shift supervisor over 3 programmers. I then left CSC after one year and got a job as a Software Engineer for atmospheric remote sensing satellites. Been there 10 years. In that time I've done systems admin (Linux), Web development (php,perl, python,java & jscript) in addition to projects in IDL, fortran & C/C++. People skills along with ability and the willingness to do learn are what is most important. When I need information , I first use google then I get my employer to buy me a book. If you have solid programing skills, a solid foundation in writing secure apps and a good understanding of algorithms, it won't matter what language is used.
There are some basic things I can tell you. C/C++/ASM are good things to know. If you can understand a pointer, a pointer to a pointer, a list of pointers, references, pointers to references, references to pointers, and such then you will be far above many of your classmates. Even if you end up using Java (like I have) it's still good to know.
That said, I'd say learn SQL. I learned it in school, it was part of my curriculum. I was glad I learned it. It's an interesting way to look at things (since it works quite differently from something like C++). I didn't expect to use it too much. But I was good at it.
So I got my job which defiantly included needing to know SQL. And man I use SQL every day. I never thought I'd use it so much, even in a job that works with web applications that connect to databases. I write reports, queries, insert statements, all sorts of stuff. I end up doing stuff some times (like gathering a little bit of data someone gave me in an Excel spreadsheet) and I can't think of anything but "this would be so much easier in SQL". It's amazingly powerful, and it's cross-platform. If you learn it, it will work on Macs, PCs, Oracle, MySQL, Postgres, MSSQL, and quite a few others. There are some tiny differences (like some function names) but that's pretty easy. It's amazingly powerful.
SQL is a huge skill. If you can prove competency in it, there are a TON of programming jobs out there that will want you. Building e-commerce, inventory management, data analysis, tons. Everybody and their brother has some project that has (or should have) a database back end.
Learn SQL now. In all I read about programming when I was in college or high school, before I had a job, I learned quite a bit. I saw opinions that said I should learn assembly, Java, C++, Lisp, and others. But I don't really remember hearing so much about SQL being important. But it's a fantastic tool and a skill that should come in very handy.
Comment forecast: Bits of genius surrounded by a sea of mediocrity.
I'm currently trying to hire LAMP developers, and am seeing a glut of Java programmers in the applicant pool. Speaking as one employer, I would like to see more people strong in PHP, Perl, C, and C++. These languages have a lot of shared syntax and they interoperate well. You can pick the best tool for the job (C or C++ for execution speed, Perl or PHP for development speed). Java is sort of a general-purpose language, but will never be as fast as compiled languages, or as easy to write as scripting languages.
Your choice of computer languages will be like choosing a religion: other people will judge you based on your choice, and it can determine a lot of other decisions in your work life, so choose wisely.
Seems like an obvious piece of advice, but try to find the courses other people are avoiding. There's always one or two out there, things that scare off most of the other students. When I was in Unviersity (last year), one of the courses like that was the fourth year OS course. It was optional and scary by many peoples standards (since the goal was to learn how to write a kernel, not a GUI Java app), but was also one of the best courses around.
If you have free time, you might also want to consider working on an open source project. There's lots of them out there that would welcome more help and aren't super complicated. You can learn a lot from working on one (both in coding and in dealing with other developers), and it looks really good on a resume.
-- "So they told me that using the download page to download something was not something they anticipated." - Bill Gates
Learning skills that apply all over, and get expressed as 'targetted' skills, is worth much more over time. The ability to read, write, speak, manage time, and finally, learn and adapt...
I am an employer, a CIO who has to find skilled developers to work for me. My opinion is that there are widely different sectors in the software development world. A developer who is perfect for a medical device manufacturer might not be of any use to me. I need business-minded developers with experience in the basic skill of making a problem statement then developing some automation that will help solve the problem. I have seen enough clever coders to know that it does not matter how good someone is at C, C++, Java, C#, Ruby or any other flavor if they do not have common sense and ability to solve the bigger issues. The risk of failing in any development project has much more to do with effective communication that skill in coding. I disagree that increasing success for US grads has much to do with the number of math courses involved or the sheer skill in any programming language. I do think that it is important to know a language/tool well enough to be able to apply it to actually solving a problem. I think that there should be a required apprenticeship program for developers where CS undergrads work for a minimum of 6 months with a mentor in their chosen field. Someone's imagination of what it means to develop successful automation might be way off the mark.
The important thing is that you have learned programming initially or at the very least, been taught the fundamentals of some language like C or C++ which will let you understand how things like memory allocation works and how pointers work. If you understand those concepts you will be good. You don't need to be proficient in ASM, but understanding the concepts is important, you should learn that type of thing in an Operating Systems structure class though. Once you have learned the fundamentals of C or C++, I would say to do everything else in an easier language like java or C#, because you shouldn't spend your time focusing on your memory allocation and such when you are just trying to understand the structure of a redblack tree.
Your suggestion is very likely a good one. However, he needs to clarify his question by answering mine:
What kind of work do you want to do?
For example, if he wants to code for embedded devices, then your suggestion is a good one and I'd recommend that he focus his efforts on learning a lower level (relatively speaking) language such as C. He should also make sure he has a good grasp of hardware design and algorithms.
On the other hand, if he wants to do web based coding, I'd recommend he try PHP, Ruby, Perl, and JSP to get a feel for each. Also, learn how to configure an Apache server, learn XHTML and CSS (don't need to be an expert), and learn your way around in all the popular DBMS's you can get your hands on. Make sure you know your RDBMS theory and algorithms pretty well. Learn about some of the common frameworks used for web programming (Rails, Struts, etc.)
If you want to do graphical coding for games or visual simulators, definitely dig into some of the more common libraries (OpenGL), etc, etc...
But, it is important to remember that my suggestions are going to be just as inaccurate as everyone else's suggestions because it really, REALLY depends on what kind of work you are looking for and what company you'd like to work for.
1, 2, 3, 4, 5... That's the combination on my luggage!
How to find folks to interview? Networking. Work your contacts. Good sources include friends of your parents, your friends' parents or their friends, people your professors might know, etc. Or, find local events or societies or clubs that attract folks from your target industry. Or just call up companies you admire. This aspect of the information interview is great training for later in life, when you really want to get a job.
Build a man a fire, he's warm for one night. Set him on fire, and he's warm for the rest of his life.
... of not asking Slashdot for career advice. Ask your school's career placement office to put you in touch with recruiters, and quiz them. Cold call local technology companies, or email. Ask friends of friends. Most programmers love programming and are happy to talk about it, including the career management part of it. You just need to get past the HR flacks and reach the real guys doing the real work.
What they're probably going to ask you is "what do you want to do?" or "what markets do you want to work in?" I know for example that a lot of financial services institutions use a lot of Java, combined with legacy systems held together with Perl and shell scripts. (No joke!) A lot of large corporations are using ASP.NET to build their intranet webs. And so on.
I don't think you need to know C or ASM immediately coming out of college, unless you want to get into coding operating systems or server daemons. Although learning those does give you a deep understanding of what's really going on in a computer, i.e. so THIS is what my C# looks like when it gets compiled!
And don't ask Slashdot for career advice.
Here's the better news: Your passion for underwater flower arranging or any other not-IT interest can be a good card to play if you make it clear that without it you'd go bonkers because you work so hard during the day. (OK I'm an old hand, but it will be people that will employ you and you need to twig what makes them tick.)
The department sounds right to me. "Seduction" is an excellent skill to have.
Honestly, though, it sounds like he's in a good place career-wise. If he wanted to go on to grad school, he would definitely want to study data structures and algorithms in greater detail, as that's what a lot of the tougher classes end up revolving around.
+++ATH0
Its who you know. What you should really do in the next year is create a network of friends and acquaintances working in the industry. Start with Linkedin.com and possibly start hitting the forums telling people you are starting to look for a job.
Its amazing what sort of monstrosities can develop when a programmer at my company attempts to set something up and then calls me for help when it "just won't work". I'm not saying you need to know how to completely configure a cisco router with advanced features, but understanding general concepts like ip addresses, host and network portions of an address and how that relates to the subnet mask as well as the basic principal behind how a packet gets from point A to point B would do wonders.
I didn't read the articles by the NYU professor, but I don't think his article is relevant to your decision.
Do what you like doing and pursue your interests with passion. Play guitar like Steve Vai. Play chess like Kasparov. Know algorithms like Knuth. That's all you have to worry about.
I'd trade every so-called "skill" on our new hires' resumes for just one person who'd recognize a clue if it hit him upside the head.
For one, don't let fear mongering articles like yesterday's scare you into something you didn't plan on doing on Monday. The opinions of some super intelligent professors should be considered, but also remember the position they are in and how disconnected they are from real working world.
I graduated two years ago and went to a school primarily focused on Java, but the classes I took were still great preparation for what I'm doing now. Just because you're using a high level language doesn't mean everything you learned about data structures and algorithms is useless.
Anyways, there are a lot of good recommendations here but don't go overboard on changing your life to realize them. Remember who you are and what YOU want to learn, don't just learn it because Slashdot or some random professors think it would be best for YOUR career.
Reviewing just the first hour of video games.
Sure, telling someone to use BASIC in this day and age may seem childish and stupid to some, but there is a lot to be said for being able to write useful programs under limited resources. For example, picking up an old Apple II and learning how to recreate functions modern programming languages handle automatically can really make you appreciate how far along programming languages have come, as well as make you treat your own code with far more respect than you might do now. Also, it removes the overhead of the graphical user interface by simply not offering one.
If you can't figure that much out without the benefit of a pretty GUI, you probably shouldn't be programming anyway... as you probably don't have any real clue what is going on underneath the hood of your system.
8==8 Bones 8==8
I recently graduated from a small Canadian University with a degree in Computer Engineering.
What would be the most influential skill/quality I had that helped me get a job?
My Life
I went to school pursuing something I enjoyed. I didn't bust my balls over marks. I had a good time. I made friends. I talked to anybody who would listen and listened in return.
What did I come away with?
People skills. General knowledge on topics from economics to psychology. Friends.
When it came time to get a job I did as everybody, hunting down companies doing cool things, sending cover letters and resumes and calling to see if they had questions.
What it came down to was a friends dad in the electronics industry.
I had met him. He liked me and in turn he helped me get interviews with some of his clients.
I interviewed well because beyond answering technical questions I was able to converse and connect.
So don't spend your last year at school in front of your computer learning Regular Expressions. Employers expect very little practical knowledge. You have shown your ability to learn and they will rely on that.
Get out there. Go to parties. Join a club. (I suggest climbing, its super fun!)
Its way more fun and I believe ultimately pays.
Ciao,
Joel
Burn Bright or Fade Away
A programming language is just a programming language. It doesn't take long to go from zero to productive in any language IF you have a sound basis in logic and software DESIGN.
If you've got those, then add Database skills. Being able to write queries, views, triggers, and stored procedures will go a long way to making you more hirable.
Good writing skills, like using periods, uppercase letters, and paragraphs. I'm serious too, I see this lacking with undergrads all the time
While it's very important to know low level languages such as Assembly Language, C, C++, etc... as well as middle level languages such as Java, SQL, C#, etc... it's crucial to learn high level dynamic systems such as Smalltalk and LISP as they provide flexibility that you'll never find in low level and typed systems.
A well rounded education and set of skills as a developer will provide you the best chances in the work environment. While languages like Java and C# are the new COBOL and might be the "language de jure" (language of the day) times are a changing (as the saying goes) and it's best to be prepared. Beyond that, the most interesting problems are best solved in languages that approach things from a freedom of expression that Smalltalk and LISP provide.
The simply fact is that typed systems put a straight jacket upon the mind when they are used. Free your mind.
Assembly Language, Smalltalk and LISP are three languages that share a tremendous amount of freedom for the mind. Somehow that's lost with C as the so called "type safety" begins to constrain ones thinking. It gets worse, as the other article pointed out, as you head contracts into the limiting space of Java and C#. Goo languages that the mind's creativity gets stuck in. At least that's the case for me and a great many programmers that I know.
Assembly language is the most important language for programmers and developers to learn as it's the foundation for almost ALL other computing and programming languages. Once you've mastered assembly language all the other languages can be related to from a common perspective.
LISP is an important language to learn since it's the quintessential paradigm shift where programs are data and data can be programs!
Smalltalk is a crucial language to learn to grasp with fluidity the concepts of a pure Messaging language where Objects communicate. Smalltalk also has Block Closures, aka Lambda's, where code is a full first class object. In addition everything in Smalltalk is an Object that can be reflected upon, that is you can write programs that manipulate the program, or parts thereof. This provides incredible power in what kinds of programs can be written.
There are of course a number of other programming paradigms that are also important to learn as they might be of occasional use, and who knows, your brain might find them easy or compatible with your way of thinking. Check out Prolog and Functional Languages such as Erlang.
There are thousands of programming languages and even more implementations. The key is to learn one or more from each paradigm, that way you're flexible as possible in the types of work that you can deal with.
Anyone who tells you that the "only" language is X is a fool or has an agenda for you that might not be of your choosing.
A good starting point for Smalltalk is smalltalk.org. Seek out the best resources of the other languages.
Beyond programming languages it's crucial to have excellent debugging skills to find out what's really going on in a program or system or between systems. Without that forget it. Debugging is a huge win in the work place as if you can debug systems to find out what's really going on a lot of money can be saved by businesses.
The other most important area to study is concurrency and parallel programming as with multi-core processors a whole new generation of applications need to be written. The current single core focused applications can't be easily converted to multi core without being rethought. That goes for the current crop of boring operating systems such as Linux, Macosx, Windows Vista/XP/NT, etc... All these systems have got serious concurrency problems. There's gold in them concurrent systems. Users are waiting to access the full power potential that the N-Core processors provide. Oh, and those "New Cobol" (Java, C#, etc...) programmers don't get concurrency - I know as I've earned excellent money cleaning up their many messes as they attempt
There are a million generally useful things - know a couple programming paradigms backwards and forward, know business, know how to work with people, get job experience, etc. Anyone who works in software will tell you that.
:) In the end the biggest jump in quality of a software product is still from not working to working.
The biggest specific things I found out that I did right/wrong in my first year out of college.
1) Figure out what you want to do, and take as many courses in that as you can. Get into the graduate level courses as much as possible while you're still an undergrad - they are harder and are more interesting. I took every graphics course offered at my school, and it has made me even as a first-year the expert at my office in certain areas (in my case, GLSL shaders and animation algorithms).
2) Take Operating Systems courses. And don't sleep through the intro one because it sucks and then not remember it. Performance programs are getting more and more multi-threaded because of the multi-core systems coming out now. I spent a lot of my first year slowly learning proper parallel programming techniques as well as how to think about a parallel system. It's in some ways kind of a pain compared to normal, deterministic programming, and I personally would have benefited from a better class on it.
3) Take at least one real software engineering course, or at the very least read up on different development methods like Agile or the old Waterfall models. Take all of them with a grain of salt and figure out what works best for you, but it's very helpful to have at least heard of proper ways to develop like a professional instead of just hacking things to work.
4) Never forget how to hack things that work
By the way, a good side effect of taking more advanced courses in a subject is that you will often have the same professors multiple times, and they'll get to know you fairly well. I got my current job off of a recommendation from one of my profs - in terms of getting a job, nothing is more valuable than having a contact.
SOCIAL skills.
Nuff said.
We had a grad student last summer we wanted to try out but it was too much work - the guy didn't even know how to do revision control! A few years ago I checked the status of the algorithm analysis class I once took. It had turned into a pure java class (from C/C++) - but not only that: The students were given the solutions to the (coding) assignments as handouts, but they still had problems with it! Problems typing in the solutions and getting them to run...
;)
In real life, in a software business your code is what you make money from. You will need to have a solid understanding of the practical aspects of software development: revision control - how to branch/merge/commit etc, testing, knowing how to structure a software project, analysing requirements so you actually end up solving the problem you were supposed to solve etc etc. You will most likely end up working in teams, and you will need to know and perform these things on a daily basis. If you fail to know these things you will have to learn them, and you will be a poor performer (for quite some time); if you don't know them well enough you will do stupid mistakes that will cost your company both time and money. Knowing how much time and effort a coding job will take will also be an important skill - if a project manager asks you how long this and that will take you can actually make or break a project.
In practice languages are just a (small) part of a software project, alongside many other tools. Knowing your compiler, debugging, and tracing etc are much more valuable than knowning 8 different languages. You're more worth if you can troubleshoot and solve problems in 1 language (than just being able to create problems in 8). Also, understanding of the actual computer science - algorithm analysis, datastructures, and also automata theory is good. Understanding of the more fundamental hardware-software "gray area" will be highly beneficial. Learn C - it is used by most of the "big" companies that work with electronics, telecom, etc.
Learn to read and understand code. E.g. start with Linux kernel hacking. If you can jump in and get to work quickly on some code you will be more valuable.
Oh, and stay single forever, and keep reasonably fit. Have a large work capacity. This will also be a big plus
RF, Norway
I am currently a grad student and working full time. Those that are telling you that you need to know specific languages or that learning java ruins you as a programmer do not know what they are talking about. It is not about whether you know c or c++ or prolog (although all three are good to know), it is about understanding the concepts of coding. Even if you were to go learn 10 different languages, odds are wherever you work you'll end up coding in a language you don't know at some point. What you should be concerned about is understanding how programming _works_. You should know about object oriented programming, you should know about functions and serial programming. You should know about recursion and inheritance. The basics of which are nearly all contained within Java. What you should be doing is going out and learning languages that are good examples of all the concepts you need to know. By learning those languages you will not only understand the concepts better but you will be able to learn NEW languages more easily, which is way more important than trying to learn all the languages you may encounter in your lifetime. Most of the people that try to tell you that you need to know specific languages happen to code in those languages so those are the world to them. For my job I ended up using something called X++, I would never have gone out and learned on my own. But it was not a big deal because guess what, X++ turned out to be similar to Java and C#. If you know languages that cover most of the concepts, any new language you run across (with a few exceptions that are truly unique and interesting for that reason) will require you to simply learn their syntax because you will already know the concepts from the languages you have learned. and in response to the knock to java: it's an excellent teaching language that uses OO concepts and it is easy to learn as well as being cross platform. It works great for teaching structures as well as algorithms. Those that claim it is ruining eduction probably spend too much time creating poor code in good languages since they don't feel that conceptual understanding of algorithms is necessary to an education.
Eighty percent of using a hammer is having a hammer and knowing that you do and what it is.
Seriously - a lot of forum questions end up sounding like: Just don't let that be you.
A good exercise: get a piece of paper, and without referring to anything list all the technologies you can that you haven't used. Then google each with "quick tutorial" and follow one.
If a bunch of people are using it, just get yourself in the set of those people. You can always post a "question from a novice" to some forum for that tool later, but only if you know that's the tool you should be using.
Your goal, and the CS program that you choose, should really be to teach the theoretical aspects of CS more than anything else. Or if you don't want to physically go to school, start with SICP and do the MIT online CS courses. The more abstract your knowledge the better - specific technologies can and will be learned throughout your career.
Really, if you can say you're an expert Java programmer when you graduate, you and your school have done something seriously wrong with your 4 years - first for choosing Java in the first place, but mainly because your time should have been spent doing better things.
The article to which you refer was written by senior officers of AdaCore, which means they have an inherent bias towards embedded systems and high-reliability software (the two areas where Ada is still seen), and hence biased observations about what skill sets are required in the majority of computer industry jobs. That said, they are still correct :-)
Unfortunately, in all but the top universities, the CS major is slowly transforming into a Programming major. This is largely due to state legislatures pressuring public schools to quickly turn out programmers to fuel industry demand for code-slingers. Too bad, really.
I have recently been asked by my Alma Mater to review some undergraduate portfolios to determine the quality of their General Education courses. I have been appalled at the (nearly) complete lack of ability to write a coherent paper. Sometimes the voice changes, sometimes the tense changes, rarely are there actual citations and never was there any semblance of flow from beginning to end.
What was even worse, however, was the fact that the professors of these courses were giving kudos for this crap. This current generation of narcissistic praise junkies and these so-called 'educators' who give out this praise make me throw up a little bit in my mouth every time I think of them.
I did it for Johnny.
ISBN-10: 1590593898
Could recommend this book more highly to an up and coming programmer.
This is the first book that we ask our interns to read.
The second book (for those pursuing management positions) is
"Leadership and Self-Deception"
ISBN-10: 1576751740
Quote from post, "My education has not been particularly difficult or time consuming to get good grades." Within this sentence underlies the greatest problem with advanced education today. Too many are being churned through the system and exiting with a diploma and essentially GUI knowledge. Over a year ago I participated in an interview panel related to an open Information Security position at my company. We interviewed many who looked good on paper, even an MS in Comp Sci. from USC; only to determine that most of them a GUI-slingers with little programming ability or understanding beyond .NET.
How unfortunate; perhaps their educational experience mirrored the statement above.
In my search for employment, I found that "well-established companies" (read: old) still had legacy hardware/software that they maintain and create software with that technology. Newer companies and companies that embrace change tend to work with newer technology like Java, Ruby, and C#. From my perspective, if I wanted to work for one of the "well-established companies" then I needed to learn Cobol and C. I chose to work for a company that has embraced changing technology and I will be working with Java (until the next "big" language hits).
- Automata, Formal Languages, and maybe Compiling (take and advanced course)
- Algorithmics (Knuth-like, even though you can find better than the books of Knuth)
- Computer organization and design (and maybe try to write some low-level C code to really understand architecture stuff)
If you have time, try to learn some:
- Functional Programming
- OO programming
If you plan to do software engineering and hope to be some team manager, do learn some:
- Software engineering and UML (as much as I hate it as a scientist...)
- Requirements management, Process management (I don't know if there's such a course)
Let's see:
1. You recognise that there are serious gaps in your experience and understanding.
2. You are clearly motivated to do something about it.
3. But you also recognise that your inexperience means that you're not entirely sure which gaps you should be plugging first.
This puts you way ahead of a lot of computer "scientists" who are still in university.
Please, please, please do the entire industry a favour and work to maintain that passion. People who've lost their passion,who don't really care as long as the next paycheque comes in seldom make top class IT professionals, and frankly are ten a penny.
1) As mentioned by others get a co-op or internship at a company in a field related to what you think you want to do after school. In general, you'll get more experience working at a smaller company. This is because they are more apt to actually notice you, and if you're motivated more apt to give you responsibility real work.
On the other hand, if you apply to a larger company that has a good co-op/internship program, that can work as well.
2) Learn to socialize. Make sure you spend time out side of studies and have a good time. Become friends with others that are not CS/CE students. Go out and meet new people at bars or cafes and just chat them up.
Make sure to network with people at school that you think can help land you a job, either soon, or in the future. Keep in contact with them. Basically look for people your age that have their shit together. Chances are, they'll still have it together when they're working. Make sure you keep in touch with them after school is over as well.
3) If you drink, really learn to drink. Not necessarily how to drink a lot, but more to learn where your tolerance line is. Learn to keep up intelligent conversations even though you're slightly drunk, or even very drunk. Know when to stop drinking, before you're at the point that you should have stopped. That requires going beyond that point in an environment where you're not putting your career at stake. Know how not to act like a stumbling jackass when you're drunk.
4) Learn about clothes. Learn the difference between a good fitting suit and a poor fitting suit. Learn how to put together a good wardrobe. Learn how to shine your shoes, and tie a tie. Learn the difference between good fitting shirts and crappy fitting shirts.
5) After you have those taken care of, you can worry about your actual technical skills. Worry more about theory than a particular skillset. If you know 1 or 2 things real deep great. If not, as long as you can pick things up quickly, and you can do the above things, you can find a job, and learn the specifics there.
Writing - take some writing courses. Make sure you can write a 10 page paper in few days that is well organized and readable. Being a developer means a lot of writing and not just code.
Finally read some articles and books by Paul Graham and start working on a cool hard problem.
...richie - It is a good day to code.
It seems to me that client side programming is going the way of the dinosaur. Most companies want applications that are web based and don't want to muck with client side programming. You may already have experience with web based programming, but if you don't take a look at that. Also if you choose to look into web based programming spend 25% of your time on design as well. I am more of a designer myself, and I find that most of the web jobs out there are more developer based, and I think people who are already good programmers should considering doing it on the web.
"During My Service In The United States Congress, I Took The Initiative In Creating The Internet." -Al Gore
As someone who graduated college only a few years ago (2004) and as someone who has a career in the software industry and as someone who is responsible for hiring delevopers, let me offer you the following:
1) I don't believe in CS programs. I feel that they fail to prepare students for the real world. Engineering is one of the few educations which should provide students with pratical experience that prepares the student for 'the real world'. You have learned a lot of therory. In my experience good grades has no corrilation to good developers.
2) College, in general, is important for 'nerds, geeks, engineers, etc'. Sterotypically this group has poor social skills. This can hinder your professional development, as these skills are required in almost any business. Focusing on developing social skills, time management, and group collaboration will pay off.
3) Therory isn't a complete lost cause. Focus on learning how to think, regardless of course of study, college should train you on how use your brain.
4) Be passionet. College can be a great demotivator. I wouldn't be suprised if you loved computers a lot less today than the first day you stepped onto campus. Find time to utilize computers in a way that inspires you. Google Mircosoft's "Coding For Fun". Not only should you find something there that intrests you, it will help guide you into some self study of programming that is applicable to today's business world, which brings me to my next point.
5) Focus on increasing your marketable skills. The utopian academia [and dare I say slashdot?] breeds a lot of technical fringe support. While being a hotshot ruby developer might be cool in this circle, it's not as marketable as being a profficient VB.net/C# web developer. Polish your skills in using technology that is common place, you'll need it being entry level in the job market.
6) Experience is golden. Work for minimum wage, work for food rations if you have to! Finding internships in related industries will give you pressious contacts, and valible work experience to put on your resume.
Your mammas flamebait.
Learn those two languages or everything else you learn won't mean squat.
--- Grow a pair, liberals... stop letting the Republicans bully you!
Whether you will actually learn more is up for debate, but you could always try graduate school. I know it helped me secure at least a better starting salary. Most of the people who started at my company straight from college had Masters degrees in computer science. It's perhaps the second best thing to experience for new graduates.
Don't be satisfied with languages based on C and C++, or even all the Algol-derived languages. Learn Scheme. Learn Prolog. Learn Forth.
Take a class specifically on data structures whether you need to for your major or not. Proper data structures go from language to language much easier than syntax.
Find yourself a nice foreign literature class (most are done with texts translated into your language) or philosophy class as an elective. You'll find as a programmer or software engineer you'll interact with a lot more than just other CS majors. You'll have more in common with them knowing something outside your field. They'll be far more impressed that you know Moliere or Anaxagoras than some technical jargon about code that they don't understand for one thing.
Since you're looking as CS and Business, I can't be sure if you want to manage programmers or if you want to run a small programming shop as the owner. If you're looking at being a manager, look into psychology or sociology and learn about small-group interaction. If you're wanting to be a business owner, make sure part of your business education includes the basics of accounting, marketing, and business law. If you're wanting the third option, to write software for businesses, well, most of it is for businesses. Keep in mind that accounting software is probably the hardest business-specific software to write. If you're not sure what kind of software you want to write or in what business capacity then a good study of math, graphic design (for UIs if you want to do that), linguistics, symbolic logic, or electronics engineering could help in general.
One thing I've read lately (probably on Slashdot) that sounds like a really good idea is that instead of waiting for inspiration about what to write in other languages, pick two or three other languages and do your programming homework in those in addition to what you'll turn in. That gives you a good grasp of the other languages and might shed light on how best to implement things. It'll also get you used to evaluating projects based on which language supports the needs of the project best. That's something that'll come in handy if you have the ability to choose languages for projects later.
If you haven't, get a copy of Dale Carnegie's "How to Win Friends and Influence People"
- read it!
- read it again with a highlighter or a pen or pen to highlight stuff.
- read it again.
Yeah, it has some boring and dated stuff, but it is one of the best books to read on how to deal with people. Secondly ONLY to the technical stuff is dealing with people: your boss, co-workers, admins, janitors, customers, etc.You can go broad or you can go deep in the technology.
You've got a good start by digging into what interests you. Keep doing that!
Research companies that make software in the areas you are interested in.
JGT
JOAT(MON) Computer Psychiatrist
I know that this might seem obvious, but it doesn't seem to be any more. My wife has told me of a new problem with graduates that is currently be documented by employers. Namely, that because of the lack of requirements (and difficulty thereof), among other problems, that students going into the work-place aren't used to actually working. So, they put in a pathetic amount of work in any given day.
For those that disagree, lets think about the average students day. (S)he will wake up and get to there first class. This might be arriving for 8am or at some point in the afternoon. For arguments sake, lets say it's 8am. But, then how many classes a day are students taking? The full course load at most North American Universities is 5 at one time. That being split into classes on MWF and T/TH. Giving a non-skewed split of work, there'll be at most approx. 3 hours or so of classes per day.
Now, for most students this is where the typical day ends and all the work that is done. For others, there'll be a couple more hours of work through doing questions and/or reading ahead and/or... But, nothing really significant. Perhaps 1 or 2 more hours a day.
Do that for 4 or 5 or... years and it's no wonder that students have a skewed understanding of what a work day actually means. As in, the above students day is rather different from full time work where you're actually expected to work during all those hours.
So, that's my number 1; be willing to work.
My number 2 is understand what you don't know and understand how well you know what you do know. There's nothing more irritating than someone who doesn't know his/her limitations in knowledge and understanding. It's one thing to be confident, it's another matter entirely to be delusional.
Effectively, when someone says you're wrong, don't do the knee-jerk "No, you're wrong." Ask why they think that. Start a discussion. Quite frankly, IMO, if people would ask more questions instead of arrogantly assuming that they're always right, we'd get a lot more done in a lot less time ending up with a lot better quality.
For number 3, learn as much as you can that's outside your curriculum. Also, realise that you can never learn any language (or lib) specific to what you'll be using in your work when you get it. But, being able to say, I've programmed in that language a little bit, I've done -enter list here even if it's just re-writing assignments- is a hell of a lot better than starting from scratch.
This learning thing never ends btw. Stop learning and you'll quickly become obsolete. Especially in an IT related field.
For number 4, if you haven't already, watch Randy Pausch's "Last Lecture". There's a lot in there that's really really good to understand and live by.
http://video.google.com/videoplay?docid=-5700431505846055184
Ahhhh programming.. like there is only that in CS... The ONE thing which is always missing from future prospect when I hire is problem resolution skills. You fressh grads know a bit about programming, a bit about languages, dBs and such but real life problem solving, lets face it, you yougnsters SUCK!!! -Learn to think out of the box, especially while under pressure. -Learn to work and solve problems with a minimalistic set of tools. -Learn to recognize strenght in people surrounding you to help you solve problems -Learn to admit you don't know or made a mistake Mixing all this will not only help you on the market but help you in every other aspects of your life. The main problem I face every day is trying to solve issues faster with less time. Think MacGyver.. solve issues with your environnement. hope this helps Philip
I just hired two college graduates from a really large pool of candidates that our HR team recruited and winnowed. My team's process is simple. 1. Grammar and spelling. If there's a single error on your resume or anything you send us, something that you've had time to prepare and check, then what does that say about your habits in general? Seeing a simple spelling or grammar mistake just casts a shadow over things and will throw the decision towards the negative if we're on the fence. 2. Learn how to program. We don't give a damn what language you like best, but whatever it is, show us that you can solve simple problems with it. Coding style is very important, so we send candidates two simple programming problems. And I really mean simple. No big deal, right? But you wouldn't believe how few people can pass this simple test. A good number of submissions don't even compile! What are we looking for? Good programming practices, that's all. It just gives us an idea of where you are and how you think. If you're going to be writing code for us, then we need to see some examples. 3. Unit testing. Those programming problems should have a complete set of unit tests. You get extra points if you code the tests so they can be run by a framework like NUnit or Junit or whatever. But we need to see that you've thought about what will make the code fail. Those are the things that will get you to the interview. Once in the interview we're going to ask you questions to test the limits of your knowledge, and how you think, especially under pressure. What we're looking for is someone who understands that software is a craft and we are all at various levels of apprentice, journeyman, or artisan. To continually work at one's craft is something that transcends programming languages, and we look for people who recognize that.
Mad.
If you have time, try writing your own constructs instead of using the ones provided by whatever environment you're in. You're reinventing the wheel, but until you've reinvented it, chances are you don't truly understand it. Linked lists, events - even graphics libraries.
When you're in the "real world", you can start to trade off convenience for experience, but take this opportunity to make as many basic mistakes as possible while you have the chance.
Last post!
You're talking about Software Engineering, "the application of a systematic, disciplined, quantifiable approach to the development, operation, and maintenance of software".
Knowing languages is good. Theory is good also. But to make a working product you need much much more. From the inital vision, to project planning, choosing the appropriate tools (language, platform, etc.), and matching features to business process requirements, you have a lot of work ahead of you. Of course, actually writing the code is a challenge in itself, but in a lot of small- to mid-sized businesses, the "developer" is also the project manager, the analyst, the senior developer and the IT manager all at once. Careerwise you CANNOT go wrong having at least rudmentary (such as Quick Kill) and probably at least a familiarity with development methodolgies. There is no one leader, agile was big for a while but it was too cult-like.. There's a million of them, you have to match the right one to the job. People who do this are software engineers.
Wow, you know a language. Most working coders know 10. It's applying that knowledge to make or maintain software that gets you a job.
Cool! Amazing Toys.
Part of the point of the article slamming Java as a first language was that teaching Java first skips over a lot of conceptual ideas that are essential to writing good programs. If you can write good C or C++ and understand what object orientation is, you can write good Java with an extremely low learning curve. The relationship does not hold the other way. Java takes away a lot of repetitive tasks that the C[++] programmer has to worry about, but it is exactly knowing what Java is doing for you that make you more aware of what is a good program and what is a bad one. The language may do it for you, but the computer still has to do it.
Be a good generalist and computer scientist. If a company is hiring you because you "know Java" or won't hire you because you're a master C# programmer, but they use Java, you don't want to work for them. Any company that doesn't understand that the language is merely the written expression of the program and that the ability to turn a program's concept into computer algorithms is the important part is lost.
1. Learn the art of bullshit. Become an expert at appearing you know what's going on even when your completely clueless. Keep in mind that this isn't just about bluffing or attempting to do something you aren't qualified for. It's all about appearance. If you look and act like you know what you're doing, 99% of the time most people will believe you. Instant credibility. Speaking of appearance, bathing at least daily and dressing like a real business person will make the bosses swoon and your peers hate your guts. You get real good at it, you will be able to spot another, less adept bullshitter a mile away.
1a. Communicate well. If you're sounding like an illiterate teenager (in person, e-mail, it doesn't matter) that's what people will think you are. Maybe it won't be kewl and l337 to your peers, but the old people that write the paychecks seem to like it. If you're working internationally at least be functional in the language. Being in a meeting while natives are jabbering away right in front of your clueless face is not fun. The look on their faces once they discover you understood all the foolish American remarks and offer to buy them a beer is priceless.
2. Always be able to articulate the value you add to whatever you're working on. Currency value is best since even the dumbest managers are keen on money. Understanding the business need behind the technology will help.
3. Choose a technology that's interesting to you and that you like to work with. It doesn't matter if it isn't in the top 5 in last week's Network World. Even if it pays less than the skill-o-the-day. Nothing sucks the joy out of life more than a job that you hate. You'll also find that your natural enthusiasm for whatever it is you decide to be good at adds to the credibility you get from 1 and 1a.
I know we're all getting off topic here, but mine in a nutshell: No degree, some college, silicon valley, entered through Java. (though could have entered through PHP)
Long version:
I'd learned from RL friends about high concentrations of Java programmers out of work, among other horror stories. I'd heard that the Silicon Valley area is saturated with umemployed programmers, that "all" of Java is outsourced. Prior employers told me that there's no way I'd find programming work without a degree. And yet I received two job offers on the same day, one doing Java (J2ME specifically) and another doing PHP. Still not sure how that happened (as I had tried before with no bites), but it may be a combination of...
- Having the right level of confidence. Not being full of oneself while not being too timid. (and sadly, this can't be taught. I failed here too often.)
- I had spent a great deal of free time [burnout level] in the 10 months leading up to my entry into the profession by working on several personal projects, which I did show off at my interviews. In doing so I learned a number of new concepts.
- I made my resume and contact info very available, and posted a portfolio. Note that making contact info very available will result in spam. It's worth it.
- I paid great attention to the inner workings of previous workplaces, even the one that told me I didn't have a chance. Understanding the business model of the sector you're looking to move into, as well as understanding the tasks of the various engineers there, is a huge plus.
- I'm starting at a somewhat lower price. Until you're an established programmer, you're seen as a risk.
- I saved up enough to weather the storm of a long job hunt. (3+ months living expenses)
- I focused on the mobile space, which is still evolving, as well as its current tools. (J2ME/BREW) You need to specialize. Finding employment as a programmer is like playing the stock market, bet on a sector that will grow and you'll win. Mobile applications is one example, and I do expect it to continue to grow for at least 10 years. More sectors will surely pop up over time, just as many of the current sectors will shrink, or stablize to the point where development is not a high priority.
- I understand general software/hardware concepts and the major universal programming concepts. I can learn whatever specific concepts need to be learned.
- Timing was surely a factor. Those wily venture capitalists are at it again!
While I haven't taken the path that you have, my story should be helpful. Now that I have the rest of my life to worry about, I may end up going back to school and majoring in math instead of CS. What I don't know in CS varies from language to language and can be learned on the job, while math is universal, and it can be a back-up plan if the doom-and-gloom phophecies of penny programmers come true.
Charisma is the measure of someone's ability to lie with a straight face.
No, University of Waterloo, Canada
As the island of our knowledge grows, so does the shore of our ignorance.
I've spent 13 years teaching SVR4 Unix at a computer company, and the last 13 years managing, programing, tuning and troubleshooting Unix & Linux. Java coders are a dime-a-dozen, and easily off-shored. They may not write stellar, super-duper fast & secure code, but most management wouldn't know good code if they saw it. System Administration is something that's not easily off-shored, unless the data-center is off-shore as well, or you've got some exceptional data-center rats capable of following instructions, something like being able to vi a file without clobbering it. For the past twenty years, I've seen an alarming increase of bad code. I've seen developers trying to write a socket program, and not use the standard libraries to translate host & network byte ordering (htons, etc), then bitch that when they compile their code developed on an AIX PPC system onto an Intel their ports are all bass-ackwards. And these guys claim to be "network programming pro's". I see developers write perl scripts that read STDIN from the output of a command (via a pipe), and fail to check for EOF, or keep looping until they see a string that matches, not checking for error returns; only to proceed to consume system memory because the stupid program loops, and spawns 70000 copies of itself, ultimately taking down the whole server.
Learning to program in C or Java isn't enough. You MUST understand the environment in which your code will run. How else do you plan on taking the best advantage of the underlying hardware? Ya, sure, Unix is supposed to be "hardware agnostic", you are supposed to be able to run your code the same regardless of the machine. Bullshit! Sure, a stupid little hello-world program will do fine, but when you've got an application that's spawning 32 children, each with an oracle connection and a few shared memory segments, and add it signal handling along with polled-selects, well, there is a difference between Unix distributions at that layer. The more you understand about the administration of a system, and HOW that system works, the better equipped you are to write applications for that platform. You'll be aware of the best way to structure your code, how the system will allocate memory for your program, etc., and this will put you in good understanding of how to optimize that code.
Learn all you can about system administration. Not the basic useradd crap. Tear into the man pages for the platform, review every single manpage in section 2, 3, 5 & 8 (I'll presume you're already familiar with the section 1 commands). Tear into networking. Learn how to write a socket program, client & listener, then brach out & use polled selects and non-blocking IO (without dropping the system to it's knees). Try out the various system configurations for setting up things like drbd, heartbeat, software raid, xinetd, syslog-ng, etc. If you have an intimate understanding of the OS, and it's administration, that will make you a GOOD programmer, and this gives you a few options other than just being a programmer, you could be an admin, a consultant, a network engr., a security guru, etc.
I think it's pretty lame the schools jamming all this Java crap at the students and shorting them on the theory of operating systems design. Remember Xinu? (great book!) I believe that you should be very good with C and pointers. How else do you plan on writing device drivers or system level services? And if you're looking for the most diverse and flexible environment to do all this on, choose Debian. If you're looking for ease of administration choose SuSE.
Unless you want to be 100% a programmer I would spend time learning communications and presentation skills.
The best way to increase your odds of being hired is to have practical experience in your chosen specialty. Degrees are nice but employers love to see proof that you know your stuff (and a college degree does not constitute proof). Choose a project that will showcase your skills and devote as much time to it as you can for a while. If you want a C++ job, write a cool C++ app.
Take it easy there fella,
You're schooling is only going to get your foot in the door with potential employers, and show them you know how to learn - it doesn't really matter what you've learned.
Any employer that hires a graduate knows they're going to be spending their first few months training you in their own systems and practices, as well as whatever technologies they use. As has been said so many times before, if you know one language you can pick up the rest, as needed and when needed.
So learn the languages you think are fun, build stuff you think is cool, if you enjoy what you do and are passionate about it that's a hell of a lot more important to graduate employers than exactly what you already know.
I only have 2.5 years of full time software engineering experience but in those 2.5 years I've seen and learned a lot.
What seems to have troubled me from reading the article and user comments is that I do not feel as confident as I want to be in C, ASM and other related low-level programming topics.
Good, that is how you should feel. What you will quickly find out in the real world is that there are very few masters of programming languages, a lot of mediocre programmers, and a whole boat load of bad ones. The best ones are the ones that are not proud of their skills and continually improve themselves. So that is lesson #1, ignore hubris and continuously improve your skill set or expertise.
If you don't understand where to start, go dig up some of your first programs. Not the stupid "hello world" programs but the programs that actually did something. Read your own code you wrote years ago and be shocked that you wrote it. Hopefully you will understand that you could have written it better. Even the smallest details like variable name selection goes a long way. And when you're done with that, look forward and read someone else's code. Everyone likes to write new code because they don't have to read it...yet. The truth is we spend a lot of time in maintenance and improving code that could have been written better for different reasons (maintainability, bugs, design changes).
How can I spend my free time in the next year to prepare to enter the work place with a proper toolbox of skills?
Don't learn. DO. There is a big difference between learning about something and applying it. The easy part is learning. The hard part is applying and getting the experience. This is true for any topic not just technical things. There's a big reason why years of experience tends to trump all other factors.
From what I have been told, there are more jobs for Java and Data Warehouse development teams compared to lower-level programmers.
Go on a job listing board and look and investigate at what companies are interested in. Don't listen to what other people are telling you because they're probably speaking from their perspective and their desires. You have to figure out what you want to do. Call up the companies and see if you can ask them how they are using the technology. For example you will find most Java companies are not operating on plain J2SE but rather something like J2EE or J2ME. This is more than just Java, it is a set of other libraries and buzzwords that do other high level things for very specific problem domains.
Figuring out the second part, what you want to do, is going to be very hard. No job description or even talk with interviewers is going to tell you what the job is like. The only full proof method I've found is to sit next to people and watch or observe how they operate or to take the job. That will show you what the job is truly like.
As an undergrad, what skills should I be trying to attain now to further my employability in the future?
I always say the following when I'm talking to my friends: If I could go back to being an undergrad, what I would do differently is not focus so much on my grades and my particular major--instead I would go back and minor or double major in a completely different topic to computer science like the social sciences, humanities, or business. I say this for a number of reasons: software engineers and even IT people don't spend all of their time in front of a computer with a text editor, a lot of time is spent working with people. The hardest problems I have encountered in the workplace were not technical in nature but social in nature. The most successful people in any industry, organization, or even group of friends are the people that understand other people and can communicate effectively.
What I've responded to before were mainly technical questions you had. But now I will tell you that if you can understand and master what I've talked about in the last pa
On what you want to do in your career. I mean seriously, have you thought about it? Game programmer? DBA? Internet/eCommerce? Device driver developer? Management?
What you're shooting for will dramatically influence what technologies you will be using, hence the background you will need to do the job. Make a list of the top 3 IT market segments you would like to end up in and then find out what is needed to work there. A simple way to do this is go to Dice, and search on your target area. A detailed job description will tell you in a nutshell what your skill set needs to look like. I'd say that a good working knowledge of C/C++/ASM is important for any Java developer, but a much deeper knowledge will be required in certain market segments such as gaming.
| My education has not been particularly difficult or time consuming to get
| good grades, so I have spent my free time dabbling in topics and languages
| that interest me (ie Multiple GUI Toolkits, Python, Linux).
If you're working under a full course load and not finding it 'particularly difficult', then I'd say you're a very bright individual (good for you). However, this also means you're not getting your money's worth from your university (not so good for you). I'm sure there are other worthy subjects you can include in your studies that will challenge you appropriately. Try taking something that you normally wouldn't. Maybe a second language. I studdied some art history my last year of CS and had a blast. Your last year of CS is probably the most important because you have the opportunity to do some project based courses and test the theories you've learned.
Don't underestimate real world experience. A coop/Internship (potentially with more than one employer) can help you get your bearings.
Also, keep your options open. Don't assume that you will be in IT forerver. Keep your GPA up - this will keep the door open for a Masters or PhD or other professional school (ie Law, Medicine).
Good luck!
I wasn't impressed with the article you are referring to. The issue isn't programming language but breadth of skills. I work at Rutgers University. Our big applications are all in Java. But the really valuable skills for us have to do with debugging complex programs, finding obscure performance problems, etc. This means having a reasonable idea of how the OS, JVM, network, etc, work, how all the pieces fit together, and how you'd get a sense of how they are working. If your Java program starting slowing down, what tools would you use to investigate performance? What might you do? If you ran out of file descriptors, how would you fix it?
It's certainly a good idea to have some experience with a variety of languages. If you know mostly Java, C, some script language like perl or python, and maybe something odd like Lisp. But it's more important to understand a variety of problem types and approaches. Even within Java you can use most of the OS features, do multithreaded code with synchronization, do a network client and server, use a database, etc. I would think that would be more important than to do trivial problems in every possible language. There's an interesting book on game programming in Java (Killer Game Programming) that comes to grips with a lot of systems issues in Java. (I'm not arguing whether you'd actually use Java to build a game engine.)
Hardware still drives computing, so it's not a bad idea to look at the hardware/software interface. Linux is nice because it's a real OS where you can tinker with the source. Try to add some features to a device driver. Do us all a favor and implement a native device driver for some of the device types that are used on laptop computers and aren't yet supported. Or play with a robot. Or both.
But I'm not so convinced that C or C++ are absolutely essential.
Get practice writing software for people who have fuzzy, ill-defined, and constantly changing business requirements that they themselves don't understand half of the time.
Ergonomica Auctorita Illico!
Emphatically seconded. Despite being a foreigner (in my US and UK jobs), I am the one who is always asked to write or proofread papers, mailings, ads, and presentations (and I make it a point to mention that in future interviews) and my emails are always in perfect English (proofread twice; three times if I have a migraine). This makes one valuable to coworkers, professional in written appearance and you don't even have to take a class (although classes and peer critique helps immensely).
Also, public speaking. It teaches you to present yourself, your company, your background and your ideas so that they can be really appreciated for what they are. The same skills translate for interviews as well. If your career office does mock interviews - I cannot recommend them enough. Again, no class to take but very valuable.
I also with the SQL rec upthread. If you are likely to be dealing with data, SAS has proven useful to me and is something you can learn in your own time.
"I'm not good. I'm not nice. I'm just right."
think the moral of this story is that lying is /AWESOME/.
Really? Because now she is his father's next-of-kin. Now SHE will inherit the fortune, not him. His attempt to impress her with his coming fortune resulted in her taking it away from him.
Which would YOU rather have, one night with a beautiful woman, or several million dollars?
Sheesh.
- Dabbling is good--keep it up. It's much harder to find time to do this later.
- Play around with at least a couple of high-level languages. Lisp or Scheme are the canonical examples. Haskell looks interesting these days.
- I wouldn't worry about writing programs in assembler per se, but it's useful to know conceptually how microprocessor instruction sets work.
- Learn other parts of the tool chain: make, bash, gprof, valgrind, strace, regular expressions, wireshark.
- When I was coming up, I read every man page on the Unix system I had access to. There's a lot more out there now, but the concept is still useful I think. Read, read, read, read, read.
- Non-technical issues turned out to be much more important than I thought they would. I'd suggest reading every Dilbert strip. Quite a lot of those are motivated by things that really happen in the real world.
Good luck."Not an actor, but he plays one on TV."
learn how to use google to find some answers before bugging someone else or spinning your wheels for 2 weeks & putting the project behind schedule.
;-)
Ok I have that out of my system now
I've experiments to run, there is research to be done on the people who are still alive.
Indeed.com trends for java,python,perl,php
The first skill is curiosity. The second skill is research ability. The first skill gives you the important questions. The second skill gives you the important answers.
I'm not a programmer, but I would guess that it is just like most other professions. A degree is a piece of paper that says you paid attention and spent some money. Whatever degree that is in...congrats. Most employers, however, are realists, and realize that the degree only means you are either willing to work towards an end goal, went to a really crappy college and were handed a degree, or are pretty smart. The fact that you understand ANY programming language puts you at the top of the food chain for prospective employment in the computer science industry. So with that, expand your horizons OUTSIDE of computer/geeky things, to make yourself more well-rounded (and more employable at the same time).
First of all, realise that the critique in the article you refer to focused on CS students who don't really _know_ their chosen subject. Specifically:
- being restricted to being able to connect Java components together like a plumber *without* understanding what makes those components tick in the first place, and what their strong and weak points are
- not having a feel for what certain high-level instructions mean when projected onto hardware
- being unable to understand, plan, and implement simple memory allocation constructs using pointers
As a CS major, Computer _Science_ is your subject. Not specifically "coding". Apart from being competent at entry-level jobs, you should have sufficient background information to recognise, place, and absorb new developments quicker and more accurately than someone without your background. That's where the "science" part comes in. It really helps if you have a firm grasp of system architecture and understand how computers and even whole information systems consist of layers and components. Nine times out of ten a "revolutionary" change only changes one layer or component, and with it the appearance but not the structure of a system. Focus on structure, not details. You can always bone up on details, but if you don't understand the structure, you don't understand the essence.
Being able to remain current (without being deluged by all the implementation details) ensures that
(a) you will be able to spot where interesting developments are taking place and
(b) your skills and knowledge won't quickly become obsolescent. Coding skills, especially those tied to a specific language, will become obsolescent with that language if they're tied to it.
For example, dedicated C coders may have a blind spot when it comes to properly using (or even designing) object hierarchies or interacting objects. Dedicated Java coders may loose sight of memory management issues and may become fixated on "glueing components together" and "graphical interfaces". Dedicated Assembler coders may be so focused on low-level detail that they both fail to see the high-level logic of the software they're dealing with, miss out on object-oriented programming and understand nothing of e.g. correctness proofs.
As a CS graduate you should have an overview in addition to specific skills because those skills will usually pale next to the specific skills of seasoned coders.
Being able to recognise the underlying algorithms, datastructures, trade-offs, and fundamental limitations of new programming languages will aid you immensely in learning new tricks (languages, packages, concepts, systems), for very few so-called "new" concepts really are anything but old concepts improved or adapted to take advantage of new technologies.
So, here are my suggestions:
- look at http://en.wikipedia.org/wiki/Computer_science#Fields_of_computer_science and make sure you know what all of the terms referred to under "Fields of computer science" mean. Refer you your course material if needed. Ask your professors for reading material if needed. You _don't_ need to be proficient in all of them (so don't try), but you do need to know: what problems they address, what the approximate state of the art is, how quickly the field evolves, and what it's likely to throw up within the next 5-10 year. You should at least be able to explain the highlights of all those fields to an intelligent layman off the top of your head, even if you're prodded awake at 2 am in the morning.
- some fields are more important than others. Since your major says CS *and* business, you will probably be required to talk to both "hard" IT people and business people. So: make sure to train yourself to see the core of problems from both points of view, and then present what you found. Both orally and in writing. Make sure you have a look at case studies of implement
More seriously, learning a second language (if you do not know one already) is a great idea. "good enough" coders are a dime a dozen; you're not going to distinguish yourself in that area. The vast majority of coding-related jobs are in places where the code and the computer system is not the point, but just a support function for whatever the business is really about.
So, go for something different, a skill set that not everybody has, but that can be useful in your future company. A second language is good (if you're in the US, learning Spanish is not a bad idea). Learning economy, especially business-useful stuff like the basics of accounting is another good idea.
Trust the Computer. The Computer is your friend.
Some skills I wished I had learned in school were how to relax (meditation, exercise, etc.), and how to get through finals without caffeine and other crutches. Definitely learn how to cope with stress, because if you have any stress in school it only gets worse, and your body's ability to cope with it will drop significantly after you turn 30. Don't get too wound up or stressed out while studying, and remember to save some energy for a workout at the end of the day. If you are too exhausted from sitting in a chair for 8 hours to exercise, then that's a sign that you need to relax (take a yoga class, stretch, etc).
Now that I'm off the caffeine (and quit smoking a few years ago), I find it amusing watching those who still indulge get wound up like two-bit watches every day. While I'm sure they think they're getting a lot done, it's interesting to watch the toll that such a lifestyle takes on people after a few years. Chances are you will be in a position where the sky seems to be falling every day, and your ability to handle it with grace, and to stay relaxed will have a large impact on your future.
XML is unglamorous and uninteresting, but you need to understand it. Its widely used in configuration files, and its the most common format for passing data around on the wire.
We recently hired someone right out of a CS program who had never used XML, and our company had to send him to training for that. Seemed kind of silly to me that XML wasn't included in the cannon of Basic Software Development Literacy which all students must be taught.
SpyDock: Scientific Python in a Docker container
... if the reason you are going to University is to get a job. You should be there to learn how to think.
Speaking as someone who has spent 20 years on the _other_ side of the interview desk, I care a whole lot less about what you know, than I do about what you can learn. Engineering is a problem solving profession. Show me you can think. Show me you know how to solve problems. If what you "know" is something that you can bring to bear on a problem in a creative way, good. If what you know is how to solve homeworks, buh-bye.
I've intviewed people with an MS and a 4.0 GPA from a name brand university who, when given an interview problem, silently work out some answer, and without checking it, turn the pad around for me to see like I'm some T.A. who is going to check and grade their work. HELLLO... I'm not hiring you so I can check your work, I'm hiring you so you can check my work. And you get to check your own work before you present it to me. And most of all, I'm hiring you to invent things nobody has thought of before. Show me you can do that. If the university is not turning your brain into a tool for inventing, tell off your profs and transfer.
Here's a hint for you. My favorite interview question: "Tell me about something that you taught yourself."
Why? It demonstrates determination and ability to find answers for yourself, as well as demonstrating that you are a natural problem solver, not somebody who looks on an engineering education as a meal ticket.
I've been out of college nearly 8 years now and have had a very interesting and quite successful career in software development so far.
The most valuable experiences I had in college specifically toward my software development career, in approximate order:
1. making friends also in Computer Science major or field
2. specific Computer Science classes: introductory programming with emphasis on good style; operating systems; project class
3. Computer Science teaching experience, including serving helper hours and giving lectures
4. summer internships in software development, including giving presentations and writing papers
5. making friends outside Computer Science
6. entrepreneurship classes (including business and financial basics) and internship
7. Psychology classes
8. studying and interning in Japan
If you are bright and can pick up stuff fast, then in school I would strike a balance between people skills (networking, teamwork, presenting, writing) and some technical foundation (low-level, high-level design, specific areas of interest). You don't need a lot of technical details in college other than good foundational classes which you most likely have already; instead save time for the long-term, value-add stuff like friendships, work experience, practice at communication, Psychology, additional interests that can help with positions in specific industries or simply help you stay sane by having a hobby.
If you want to go to graduate school, then connections with professors will also be particularly helpful.
I would use internships and first job(s) to explore what size and type of organization is right for you (this may also change as you age). I learned a lot from internships and earlier experience at larger organizations and used it to be more successful at helping startups and smaller organizations achieve their goals. For me it's hard to beat working in a small, highly talented organization with pleasant people and a good work-life balance.
I wish I had mod points. Good points all.
So after you've picked up those languages, what then? Half the people reading this will never be more than code monkeys; it's certainly no use to them. Hell I've programmed in half of those (LISP, PROLOG, C) and nothing there is remotely useful to me in my daily life. In most cases there aren't really any practical applications for that stuff (C obviously being the exception).
It seems more to me like pretensiousness than real need. Almost all of those languages have a very specific, very narrow, strength...I learned Prolog because I was working with automata, and that's the best language for that sort of thing. When I'm not doing that, it's useless, and most people will never move in that direction.
I'd definitely recommend C, because it really does give you insight into what your code is really doing, and that does have benefits. Everything else though? Not so much.
ad logicam Claiming a proposition is false because it was presented as the conclusion of a fallacious argument.
6 languages everyone should know... C, obviously - it is as close to hardware as you want to come and gives you a good understanding of what really would happen in other langauges under their syntactic "easyness".
But the others... well, maybe, but only from an academic perspective. You'd want to know SQL for definite, and a scripted language (who cares whether its PHP, Python, Javascript or VBScript the point is you get to see how powerful its flexiblity is and how weak the features that give it that flexibility is)
Smalltalk is a good one, but I'd say any OO language is good enough nowadays, you don't need the holy grail of OO to understand it, you'll only get pissed off with lesser OO facilities.
His list is the ultimate set of languages to describe different ways to program, but I think learning "real-world" languages to get a slightly lesser understanding would be more worthwhile. In academia I'd be more than happy for people to learn those, but if you're adding to your skillset to become more employable, go for C, C++, Java (or C#, same difference), SQL and Javascript.
It sounds to me like you're at Trent.
/., the article you mentioned has ended up electronically and in print on his desk, not that this is the first time those concerns have been raised. They were even raised (by me and others) before and after our curriculum change. Second: Ignore EVERYTHING stephen says, his rare occasions of usefulness are not worth his 99% complete cluelessness. Ditch the business side of things. No this does not apply in general, it does apply at Trent. Do not aim to be a manager, aim to be useful and get promoted into management because you have skills.
First: Take your concerns to professor patrick, we all read
Lastly: The most useful people we have, in order, Are Jamie, Brian H. And Jim. Talk to them. They know what's going on and what will get you directed towards useful, employable skills. Jamie's course work is by far the most directly employable, but both Brian H and Jim have years of industry experience, and know what's going on.
If it makes you feel better (and it should) our graduating class from last year are mostly (90% of them, literally) doing quite well with respectable jobs and prospects for advancement, the ones who aren't doing well tried to do things they weren't really interested in, and that's a matter of personal growth.
Look for situations where the lottery odds are tilted and try to use that tilt in your favor. Talk to a large sample of people working in the type of industry in which you are interested. If 2X% are using some language, but only X% of students are studying that language, then look into learning that language as one way to help your odds at the job lottery.
Good luck!
All the talk on which languages to learn is missing a fundamental point. Computer programming isn't about the language you program in. It's about the data structures you use. If you want to be a good programmer get good at composing and transforming your data. Learn (inside and out) all the basic structures. Keep learning new ones. Not that you'll build them from scratch yourself but you'll know what's going on when you come across one in the wild. Throw in some analysis of algorithms. Sadly I couldn't analyze something these days to save my life but you'll know the stock answers [True story. I once had a (self-taught) programmer reporting to me use a bubble sort for several thousand rows of db extracted data. When I asked why he didn't sort using the database or sort() he replied that he didn't know how those worked internally so wrote the one that he knew. :/] and be able to make educated guesses.
:) and comment your code.
Once you know the structures and some algorithms then learn languages and implement what you already know. You'll pick up new tricks from each language as you go and be able to pull those out in different language settings when you need.
The poster(s) that mentioned learning the business end of software engineering, proposing, designing, herding-the-cats, developing, and not getting stuck in ongoing support (you want to be good enough to always be on the next project and not the guy stuck on phone/case support ten years after the project has been out) hit the nail on the head. There's a lot more of that than there is of coding (or at least it will feel that way). To get good at the above items you'll need to develop those writing, speaking, and presentation skills.
Be sure and learn about revision control systems (and the data structures and algorithms involved
All the rest is just putting up with politics large and small.
-CZ
Step 2: Write a simple game with graphics and sound. (It doesn't even have to be good).
You'll need to teach yourself some 6502 ASM to write anything of note, especially for sound. You can't learn ASM without learning architecture, and the 6502 is a very simple, clean design.
MIPS-1 is a better alternative for modern superscalar/pipelined architectures, and it's also a load-store architecture (vs. the accumulator arch. of the 6502), but the system's size being what it is -- 64kB, simple graphics (16 colors low-res, 6 hi-res), 2 general-purpose registers, 8-bit everything -- will allow you to really explore a variety of different things. It keeps things simple.
The great punchline of the university system:
(New hire): I have a First Class Honors Degree* degree in Engineering!
(Everyone else): Good for you! Now make the fucking tea.
* That's like a 4.0 for you yanks.
Get some SQL under your belt, and maybe take a databases class. Its everywhere in the job market, but schools don't usually promote it.
Also, learn the LAMP stack if you want to be a developer. Statistics knowledge is very marketable. Take some classes.
Most important: make sure you enjoy what you're studying / doing. It doesn't have to be your ultimate passion of the moment, but have long-term goals that fulfill your passions, dreams, ideals, etc.
Take as much of these as possible while in college:
1. Writing.
2. Mathematics.
Everything else is vocational and can be picked up on the job or by self study.
Forget anything the developers have told you and get into management. Why? Management owns the developers.
Get the book: http://www.debuggingrules.com/. Full disclosure: I am the author. But it was IEEE Software Magazine that said this should be required reading for all technology students. And unlike most other tech books, this one's cheap, funny, and a quick read.
"Debugging" by Dave Agans - the perfect gift for your favorite imperfect engineer.
Get involved in an Open Source project, Summer of code or whatever interests you. Try to gain some experience as soon as you can,
specially on fields you don't feel comfortable with.
Try to target an active community, you'll learn by observing how people behave on mailing lists, how people react to code, criticisms etc.. A major OS project (Linux, Mozilla, Ruby) would be great.
The ability to communicate through writing and spoken words are required in any field, transferring your ideas and thoughts to another is part of your professional life as well as your WHOLE life. You were taught to communicate with computers through code, you will undoubtedly need to communicate with managers who don't share your expertise, users who don't have your level of understanding, fellow developers with varying degree of technical understanding. As much as we all wish to shut the door, code the next super killer application, and release it to the world and be showered with praise and reward, in reality, there is much more work involved in convincing people and gaining trust. Think about this, are you employed to write only code? Aren't you there to create a solution to a problem?
If you want to prepare yourself don't get caught up on languages, OS's and technical stuff. Focus on being able to work on Large Projects. Start, Middle, and End a full life cycle of a project. School tends to focus on skills. A large project that takes months is a good learning experience. It teaches you that it is near impossible to make your code ultra efficient and even fully documented. You will learn what corners you can cut and what you can't and when users get back telling you what you though was your ultra uber program sucks. Gives you some realization knowing how to make real maintainable code. Not CS Get an A+ maintainable code.
If something is so important that you feel the need to post it on the internet... It probably isn't that important.
As a CS student, you should be an expert in Java. And C. And a modern assembly language.
You should have knowledge and substantial project work in LISP. And C#. And various interpretive languages.
You should know HTML. And CSS. And how to build a compiler, and operating system, and a relational DBMS.
You should also follow up and be expert in other areas of your own interest.
It shouldn't be easy, even if you're damn smart. It should be a challenge, and it should consume your life. That's what school is all about. Get with the program and make it happen.
-
Get into an embedded system (or another low-level prog) project
I was strongly considering dropping off engineering school before joining our solar car project. It completely consumed me and I quickly became the electrical lead, allowing me to work on a lot of cool little projects: telemetry, radio comms, driver control and interface, etc...Not only I had loads of fun, traveled around the country, made a lot of friends, and learned tons of leadership and engineering skill, but I also got the one job I wanted doing what I wanted because I could demonstrate that grades don't show the entire picture.
I honestly answered the following question from the VP of engineering during the interview for my current job:
"Why are your grades this 'low'? Our other candidates average a 3.5"
My answer:
"The day only has 24 hours, I had to make a choice of how to be better prepared for the work I wanted to do, so I chose to stay in lab and finish things than to better prepare for exams".
She later told me that's why she hired me. That happened in April of 2005, so it's not some old man's tale as I also graduated in April 2005.
I don't know what your grades are, but be passionate and honest about what you really want and go after it! In embedded system engineering (or any other low level stuff), you need to show in your interview that you are willing to be hardcore.
Unfortunately the majority of people obtaining a CS degree get stuck on some particular tool (e.g., Java) and spend the rest of their career suffering from tunnel vision (every problem looks like a nail). Your goal should be to learn enough of the basics and theory that you can pick up the textbook for any given technology and be up and running within a week or two. Here's a list off the top of my head of things you should understand:
[Hardware]
The fetch/decode/execute cycle
Instruction decoding
Pipelining, out-of-order execution, etc.
Caches
TLBs
Busses
Interrupts
Discs
Networking hardware basics
[Software]
Programming language paradigms: imperative, functional, OO, logical
Finite automata
Grammars and parsing
Data structures: lists, queues (FIFO and priority), dictionaries, sets, trees, hash tables
Algorithms: sorting, searching, etc.
Memory management and garbage collection
Big O notation
Type systems (in particular, Hindley-Milner style) and type checking/inference
Basics of security and encryption
The relational model for databases
Concurrency: pi calculus (or some relation), locking and lock management, software transactional memory
Distributed systems: data exchange, error handling, establishing communication channels
Queueing theory basics: Markov chains etc.
Programming language implementation basics
No doubt I've missed a bunch of important things off the list.
All of the mundane stuff about learning various programming languages and toolkits should be seen as a means to explore the above topics, not as an end in itself.
Hope this helps,
-- Ralph
I've been programming for 35 years and this is what I've learned: Languages are not hard, data is hard.
By the time you finish school and get a couple of years into your profession, whatever you decide that will be, the languages will have evolved or possibly even changed completely. Spending time worrying about what languages you are using in school is like worrying whether you can operate an iPod. It doesn't matter because by the time you get out of school the iPod will be extinct and you'll have to learn how to operate the next thing (undoubtedly starting with an i).
So, what you should be doing in school is learning the things that don't change: algorithms, data structures, methodology, problem solving. Seek out those professors that are providing problem "contests" and get involved. Find a public source project that is working on something interesting that you've never done and jump in. Get a team together and join one of the online programming contests. Anything you can to get exposed to as many different methodologies and as much data as possible.
You will need to pick some languages (and your professors will force some languages on you), but don't balk at learning any new language. Also, it is my opinion that you should learn at least one assembler language (but it hardly matters which one) because it will force you to look at data in a very different way from programming in a higher-level language, even C. Understanding how things work at the lowest level can only help you to figure out problems later.
Some may argue that learning a slew of languages will cause confusion, but I haven't found that to be the case. I have learned, and used professionally, upwards of 22 languages (so far) though I currently only use about 4 on a weekly basis (PHP, C#, XSL, JavaScript) and maybe add another 3 or 4 that I use occasionally. I didn't learn a single one of these when I was in school (they didn't exist).
So the bottom line here is that flexibility should be your goal. Try to learn in school the things that are common to all software development. Be a generalist until you know what you want to do for the first few years of your professional life, then become a specialist in that (and while you are working those first few years keep an eye to what you want to work on next). Don't ever assume that you are done with your education.
My favorite phrase is: when you stop learning, you start dying.
Try going from C++ to Ruby or JavaScript. Possible, but there's a lot of things that it will take a long time to wrap your head around. (Closures being a simple example...)
But for a real challenge, try going to Erlang, Haskell, or Lisp. Of those, Haskell is probably going to be the weirdest, but I don't have a truly thorough understanding of Lisp yet.
Don't thank God, thank a doctor!
Try writing skills for documentation, and emails. Developers with good writing skills, like spelling, are in high demand. Suits also love to reward engineers who are good at Power Point with things like promotions and raises. Being able to deliver a good Power Point presentation to the Suits gives you a edge over the cheap guys in India.
You might also want to study up on marketing and sales. Remember you are the product, and you will probably never stop selling or renting yourself yourself through your entire career.
If someone is passing you on the right, you are an asshole for driving in the wrong lane.
You'll mostly get advice to improve people skills--the technical stuff is just as important.
I've found that one generally has to make a choice between money and personal satisfaction. If you like fancy cars, fancy houses, and the prettiest women; then I suggest you look for where the demand is. Otherwise, pick what you like. If you like low-level stuff, then go there.
Note, however, that offshoring may increasingly remove opportunities for low-level programming because its usually cheaper to define the requirements and send them off in a fairly clean requirements doc to the 3rd-world. You may have to bid low or move to another country to compete with 3rd-world PhD price levels. Or, move into project management where you manage offshore teams instead of compete with them at the tech level. You'd become a liaison between on-shore management and remote tech teams.
And, keep up your people/social skills. Offshoring magnifies the need for that. If people don't like dealing with you personally, then they are more likely to settle for offshored labor.
Table-ized A.I.
you get paid like crap, it's really hard, schedules are very tiresome/stressful.
you do it because of all the really cool shit you learn, and the opportunity to hang with artists.
since there's artists, you can snag a really cool wife, before you burn out and quit the industry.
that said, i'm still there, and like it. it is really interesting.
music - http://www.subatomicglue.com
There are plenty of college graduate level jobs for Java developers out there, and skill in that language (note that there is a big difference between skill in the language and being able to write a hello world swing application in it) will be in demand for some time. Java is the new COBOL not only in the sense that it is clumsy and somewhat outdated, but also in that it is the default business application development language. Also remember that after graduation you will be a newly graduated student. You will not be expected to be a guru in the software world. The notion that many seem to have that fresh graduates from college should be as qualified as professionals with years of experience is just ridiculous.
That being said, throughout your career you will be constantly learning new skills. You will have to learn new languages and new paradigms, so you might as well start now. Hopefully the main thing you took from your CS classes was the backing theory (not to mention mathematical skills) that makes learning all that possible. The problem is with some schools that seem to be nothing but Java/C#/whatever-shops whose graduates have a very limited knowledge of anything outside of that one language.
Mathematics is made of 50 percent formulas, 50 percent proofs, and 50 percent imagination.
Sorry if this is not a direct answer to your question or seems like a shameless plug, but... I wanted to make a reading list for new programmers a while ago (because I ended up recommending the same books over and over to my friends and people I work with) so I started this: important books for programmers. Unfortunately I never had time to complete the writeups as to WHY I think most of those books are key, so basically the above is a list of links to books I read and thought others should too. I am mainly a C/C++ programmer nowdays so the list is skewed that way but I tried to make sure the fundamentals are covered as well. Feel free to contact me if you want to know more about why a specific book was chosen.
http://ed.markovich.googlepages.com
Depends on whether you want systems type job, or application type jobs. Datawarehousing falls in the business application domain. Java is mostly for business applications too. If that is what you want, then as others said, get a coop job to get a feel for what work is like. If you want to do device drivers or systems level things, then you'd better do something about it.
...etc.
In all cases, having a tech job means that you continue to learn as long as you work in the field. What you know now will be obsolete and that will later be obsolete.
After a while, you may get bored from coding after doing it year in and year out, and want to do other things. The desirable skills are people skills, team building, supervisory skills, organizing, written and verbal communications, presentation, interaction with customers,
2bits.com, Inc: Drupal, WordPress, and LAMP performance tuning.
Dan Kegel of C10K fame has an excellent web page on this topic.
sigs are a waste of space
(Almost) anything technical you need to know can be learned on the job, provided you have a basic foundation of knowledge.
Whatever it is you decide to do, be passionate about it. If you enjoying writing scripts, tell them why and what you've done. I enjoyed data analysis, and was able to talk in great detail about an independent project I did for a data mining course. The passion will show when you talk with potential employers / grad schools / other opportunities.
I would say that the following things are the bare minimum:
1. Know how to program using one 'core' programming language. (C, C++, Java, C#, etc. Something commonly used for application development.)
2. Know a scripting language. (Python, perl, ruby, etc.) Know when you should use a scripting language or a core language.
3. Know how to use version control software to at least check in, check out, synch to latest revision and revert.
If you do only this, and can demonstrate to a potential employer that you know how to do these three things, you will be employable. If you can't do these three things, you will have a lot of difficulty getting a job.
After that, focus on:
4. Learn to communicate well. Be able to comprehend written material, write coherently, and speak effectively.
5. Knowing how to branch and merge code in source control.
6. Develop something real using both the core language and a scripting language.
This stuff is great to know. It will help you land a job (because you can demonstrate that you will be useful) and will put you quite a bit above the other new grads when you start working. Someone who just does the first three is a solid hire that has a lot to learn. Being able to do 4, 5 and 6 will make you look awesome compared to the average grad. This material is most useful after you've been hired.
Next:
7. Try to develop a thick client application with a gui; a command line application; an app for windows; an app for nix; a web application; something that uses a database; something that reads and writes files; something that works across a network.
8. Redo the above applications in a language that you don't know. Spend time thinking about what's the same, and what's different between the two languages. Why would you choose one over the other?
9. Go read some books on design patterns and best practices.
10. Know how to perform basic operations on a nix machine, a windows machine, and a mac.
11. Brush up on your 2nd year Comp Sci material. This will help in most interviews.
This section will help make you a flexible dev. If you do even half of this you will be able to tackle 90% of the problems that a new grad hire will face in their first job.
That's it.
I know that people will look at this list and think 'Well, that's a stupid list, everyone should be able to do that.' The reality is that most new grads can't. I've considered over 300 resumes in the last three years, and interviewed ~50 candidates; maybe 20 of those people met the first three requirements.
Even if you can just demonstrate the first three items, and somehow prove that you have some brains in your head (marks won't help with this, sorry) you will be hired. I promise.
You sound like you are going beyond what you are being taught which is a great approach.
Given that you are in third year, instead of just picking up extra skills randomly, why not scour the companies and find out where you want to work, who you want to work for and what you want to do.
Once you find a few viable companies and positions, see what skills their job postiongs are asking for, or contact their HR deparments directly to get the information. Once you find what they are looking for, make sure you have those skills, then figure out the best way to demonstrate you really have those skills to an interviewer.
You are probably going for interviews in less than a year. This gives you about the right amount of time to target the job you really want as opposed to just applying around and taking the best of whats offered.
Tesla was a genius. Edison however was a overrated hack who liked to torture puppies.
bow hunting skills, computer hacking skills... duh...
Jesus saves souls and redeems them for valuable cash prizes
Almost nobody programs assembler anymore so I wouldn't worry about that. Writing a few small to medium programs in C or understanding an contributing to an open source one is more than enough of that. Unless you are headed for something close to the metal I don't see that any more knowledge of C would be useful. Besides it is pretty darn simple as languages go.
If you are heading out to get a j-o-b then knowing Java, Python, Ruby and or C# is going to mean a lot more than C. What kind of job? Most of the jobs are either Java or C# numerically. But there are an increasing number of python jobs and a small number of Ruby jobs. If you ask mean both of those are a heck of a lot more fun to hack in. That aside what kind of programs, systems, environments charge you up? Tailor your skills for what you want instead of trying to make yourself a generic software shmoo.
If you are young then I think you should consider Paul Graham's advice on doing a startup rather than immediately become an employee.
-- Butlerian Jihad NOW!
We see lots of gawdawful candidates.
Ideally you would: Start with a semester of python - it's easy, it's fun, it's very productive and readable, and if you can't do this, go home. Then we throw you into C so you can see what's making this all work, to have some appreciation for low level and managing memory, and to make you realize how easy you had it. After that, C++, Java, whatever. You should know how to write well, how traditional software development works, how agile software development works, and how version control works.
You should have designed and implemented several projects from start to finish. This is possibly one of the most important things - all the classes in the world won't help you if they don't involve full projects.
After that, well, then it depends on what you want to specialize in. Java programmers are always in demand if you really want to be toiling on projects with legions of interchangable monkeys who are dumber than you - it really is the new COBOL, designed to let lots of idiots work together without doing too much damage. I know some fantastic Java programmers, but they're real exceptions. C# is quite hot these days if you like apps stuff. Embedded Linux is extremely in demand. Web devs seem to be doing pretty well.
You personally seem to be doing quite well - I thought the Java screed missed the point in that it wasn't the Java that was the fault, it was the lack of any C or C++ or ASM to go with it. If you're not comfortable with C, you probably want to learn some more of that - it's still the language of choice for systems, and small and clean enough that you don't have to fight it much while learning concepts. As someone who is fairly good at C and C++, I am going to say that you will waste so much time learning and working around C++'s ugliness (instead of getting things done) that it's not worth it unless you think you will be doing a lot of it.
So a bit more C, do what's fun and *design and make some products from scratch*. Polish some of them up enough that you would feel proud if you released them. The problem solving that goes with this is the single best skill you can have, is what separates the software engineers from the programmers, and is one of the best ways to get a job. I walked into my interview at this company with a pile of things I'd written (some released) on my own and was pretty much hired on the spot, and if more interviewees would do this we would be likely to hire them on the spot too barring any glaring issues.
I also can't say strongly enough that going for Java, DB, or Data Warehouse stuff just because you think there will be a lot of jobs in it is the worst mistake you could make if you don't actually like doing it. It may be a good living, but you're too young to do something that soul-crushing on purpose so soon. There are lots and lots of jobs for software engineers who are good at what they do - pick what you want to do and get really good at it and have fun and a quite comfortable living will follow. It's the code pigs whose jobs are at risk for outsourcing, not people who can actually solve problems.
P-E-R-L, Perl Bitches!
Seriously, as an undergrad you need to understand IT fundamentals. Like how data structures work. How memory allocation works. How sockets work. How debuggers work. If you understand the fundamental concepts, you can learn anything else.
Unless you have a rich uncle who will guarantee you employment when you finish school, you need to have as broad a base as possible. And something that's invaluable is getting yourself an internship. It's experience that means a lot on your resume. If you do a good job, it's a foot in the door. Many employers will give higher priority to someone who has interned with them and has a rapport with their existing employees.
Also, you'll do well to learn which professors know what in the hell they're talking about and try to only take classes that they teach. You will learn much more from a professor who knows more than you do.
"Hi. This is my friend, Jack Shit, and you don't know him." - Lord Kano
You must be good at creating spreadsheets. Spreadsheets hold all important information.
If you are to go places you will enjoy learning. University will probable be the last time you can do it full time, enjoy it. If you are lucky you will be able to take subjects from all the schools, pick the topics of interest and take them. In my case I got a lecture from the head of the engineering department telling me "no more" because I was devaluing the engineering degree. Fortunately the other departments didn't stop me. The ones I enjoyed most, how to program these new fangled things called computers. Oh and more maths.
I expect that many on Slashdot will disagree with me, but I will voice my opinion anyway.
The University (or the College) exists as an intellectual haven, a location for like-minded individuals to congregate and exchange ideas in order to advance human knowledge. While the credential that one receives upon graduation is certainly important (and usually helps career development), it is not the primary (or even A primary) motivation for attendance.
If your sole interest lies in getting a job, there are institutions that exist for this purpose; they are called trade schools. While many look down on them, they are perfectly legitimate entities that simply serve a different role in society. If you find the idea of transferring to one unpalatable, then I advise you worry less about your employment.
In my experience there are two facts true about most college students. First, a great many will end up in a career largely unrelated to their field of study. Second, those who have difficulty finding a job tend to be those who focused too narrowly in their studies and thus lack flexibility.
So, what specific advice would I have for you?
1) Read things not related to computers: the New York Times, James Joyce, Shakespeare, H.G. Wells, Stephen Hawking, or whatever your choice of source or author may be. It is fine to read computer books (in fact, I am currently giving myself a refresher on database theory), but computer books will not teach you how to communicate, nor guide you when you meet an inevitable obstacle in the real world. It is worth noting that all but the most menial jobs require good communication skills; I have personally seen a worse scientist receive a professorship simply because the better contender was ineffective at explaining his research.
2) Get to know many people, especially those outside your field. Laymen can often provide insights into problems that would never have occurred to "experts." If nothing else, you will build a network of friends to whom you can turn when searching for career options.
3) Take classes outside your field: learn Chinese, or study early modern Christianity, or take up political science.
4) Relax, and remember that programming languages change rapidly, even fundamental design principles change. You can, and will, evolve your skill set to match. It is more important to now gain wisdom about less ephemeral topics.
Take the advice for whatever you feel it is worth.
How did this misspelled tag make it to the front page?
Depends on what you want. If you want to make money developing software, systems programming is the way to go. That is where the money is, but it may not be as "fun" as other programming. Reality however is that no matter what job you get, most of it is going to be "dumb" routine for most of the time anyway, so I wouldn't worry too much about how fun things are.
So, for money as a developer learn Java, Oracle, DB2, Web services etc. That will get you the decent paying jobs in the short run. Make sure you are a generalist though, what is hot today is cold tomorrow. Well, except for Oracle and DB2 that is.
More importantly, if you want to make real money, is to learn something that has nothing to do with technology. Technologists (OK, geeks) are a dime a dozen these days, and getting cheaper by the minute. What the industry is seriously lacking is geeks with other skills. Social skills perhaps :-). Not really joking. Take classes in public speaking. If you work in the private sector you'll make more money teaching people technology than actually working with it. Learn something about business and economy. A sales engineer (a technology savvy person who can convince people he knows stuff and that his stuff is better than the other guy's stuff) makes twice what an engineer does, or even more, and he works less. A lot less. He also has a lot more fun.
The hardest thing to find in technology is someone who really gets technology and can communicate this to others. Sales. Teaching. Evangelizing. They all pay better than the pure technology job, and it is also a job you can have past forty without going insane. If you like your self and want a family, make sure you don't end up coding past forty. It's not worth it.
1) Learn how to manage conflicts. They are guaranteed to come up. 2) Communicate technical ideas well to non-technical people. Will your manager understand the technical details of your job? What about his manager? 3) Lean to present well. What better way to impress many people at once? 4) General Problem Solving Skills. A competent technical interviewer is likely to test you on this and be more interested in your performance than he is in you remembering the exact syntax in some language or some details of some library (although you should know those things to some degree). 5) Be generally eloquent and friendly The social aspects of work are often ignored
http://yetanotherpoliticalrant.blogspot.com
Don't become an employee unless you just want to understand what being an employee means. You should become an independent consultant. And yes, it's easier than it sounds. You can find initial clients through professional associations and conferences.
I second this. And knowledge of a software package can help you a lot. I learnt to use simple bookkeeping software when I was 13-14 years old, and more complex software 5-6 years later. This has helped me much. A nice package you can try is GnuCash.
In the end, C++ is a valuable skill for a number of areas - 3D, games, driver development, etc. However, for most web development it's almost useless, and there are a LOT of web development roles around. Equally, a lot of the bespoke business development requirements (which also account for a significant proportion of real-world vacancies) are generally more focussed on database accessing and so on. You look at Slashdot and the like and you could think that you should learn Ruby and C++, but if you're mainly thinking about a career, the thing to really to is to look at the job market in your area and see what skills are actually in demand. Like you I've learned some C++, and have a reasonable understanding of memory allocation and so on, but am not as comfortable with pointers as I'd like. In practice, I've had to stay away from a couple of bits of code at companies I've worked with, but it's not been an issue. VB, ASP and .NET skills have been the main things I've needed, and, looking around, most of the well-paid jobs in my area are more interested in .NET (C#) than C++ now anyway. I more want to be more comfortable with C++ for my own sakes than because it's required for my career. Just as I want to know more about Python and Ruby (especially Ruby at the moment, since I like various aspects about Rails) for personal satisfaction rather than for career reasons.
Of course, if you want to get into games development, then learn C++. Learn to use DirectX and so on. Focus on those skills. You may be able to get by with XNA and C#, but it's cutting off your options.
If you just want to code for a living, and the salary on offer is more important than the particular focus of the development, then feel free to focus on Java or C#, as there are plenty of well-paid jobs which don't need any pointer referencing and dereferencing, ever.
What I can say is that employers seem to prefer someone who is really good at the skills they regard as key, rather than having all of the nice-to-haves. I've been something of a generalist, picking up C++, VB, C#, Python, Ruby, Javascript, Java, PERL, PHP, Delphi, PROLOG, etc. Even working on existing code in an unfamiliar language on occasion (being a generalist does at least help you hit the ground running with an unfamiliar technology). The existing employer valued the skill, but when it came to interview time for the next career step, most of the skills were irrelevant to the employer. A solid focus on a solid, narrower skill set (e.g. .NET/C#) seems more valued.
As noted by others, database skills are in demand for many development roles so rather than worrying about whether you've learned enough programming languages, making sure you're good with either SQL Server or Oracle is more useful for maximum job choice. Don't worry too much about missing some areas of knowledge - you can't learn all languages in full depth. And you'll still have a lot to learn (and the bar keeps moving, so there's always more being added to the 'stuff to learn' list).
While you're looking at the step from studying to employment, give some thought about what you CAN bring to the table for an employer - at the end of the day, one of the developers I know that would have the hardest time getting a job is probably one of the best coders I know... their interview skills are useless, while one of the worst developers I've met had no problems getting a job... you need to sell what differentiates you to the employer, and once you have that first development job, then you can work out what you really need to improve on for that role. Worrying about what bits you might need to know is not necessarily productive, because different industries have very different development requirements.
Wow there are a lot of responses here. I wonder if anyone will read this...
But I'll type anyway. Although I agreed with the article saying that CS programs should teach more than Java, if you want to be a programmer, I don't think you need to worry so much about that.
Remember that first and foremost a programmer is a writer. You spend endless hours at your desk writing. And no matter where you end up, you will likely be buried in a pile of crappy code. So you need to know how to read and write code. And just like any writer the best way to learn is to read and write.
Spend every second you can reading other people's code and modifying it. Write your own code. Think to yourself, "Is this good code or bad code". Ask yourself "Why". Try to improve bad code. Try to write code from scratch. Try to emulate good code.
When you get into the working world, you will be horribly constrained by both deadlines and the sheer weight of the code you are in. Learn how to move on your own. All to often I see people writing the same bad code over and over again. They are just overwhelmed by where they are. They have difficulty improving their writing because they have never taken the time to read and write just for themselves. So if you have the time now, please spend it reading and writing,
One other thing. One of the best ways to improve is simply to refactor code. Pick some project at random. Find some bad code. Build a test harness around it. Rewrite it so it isn't so bad, but does the same thing it did before. This will lead to significant insights.
Do not concern yourself with learning the language-of-the-month. You are a Computer Science student, and you don't want to end up as somebody who gets their job outsourced to Bangalore when the new fad language comes into vogue.
Start by decided what career path you would like to take. There are two primary ones for CsC students: The Computer Industry or Corporate IT.
You want to work for MS or SAP? Do you want to write code for products that will be sold? You need to know lower-level stuff. You need to know C, C++, and probably Java. Do not worry about all those languages that are primarily used for writing database applications or building websites. Beyond that, take classes in technical topics that interest you.
Do you want to work in Corporate IT? If so, you will never need C, and are unlikely to need C++ (although they wouldn't hurt). Instead, learn everything you can about databases, SQL, and a couple of languages used for DB front-ends.
ASM is nice, in the same way that higher math is nice (stretches your mind), but unless you want to write embedded software, you are unlikely to need ASM.
Beyond that. You MUST have vaguely relevant experience, or you will have a far tougher time getting a job after graduation. Your jobs don't even have to be in your particular specialty, but they MUST be technical and/or involve leadership of some sort. For myself, I managed a retail store at a Cub Scout camp for three years (also in high school), spent one summer in the Pentagon doing help-desk-type work, and spent another summer doing lightweight webmaster and DB front-end work. On top of that, I did help-desk-type work for the school's IT dept.
SirWired
Is that the point of the "wouldyoulikefireswiththat" tag?
I agree with the majority of the article except for stressing the importance of Ada. What a horrible language. Specific reasons: 1) Ada is a defense industry language from a long time ago and is dying. Nobody outside of defense uses it. Even within the government, while existing systems require maintenance, the language is not being used for new applications. 2) It does not teach the basic concepts well. It has the flexibility of Pascal in the sense of allowing anything you want to do. I am of the opinion that a stronger definition of syntax and strictly defined primitive types would make for a better experience when transitioning into other languages. As to the rest of the article, I agree with the majority of it. The general trend should be that, while languages like C# and Java have a great place in understanding OOP, they do not help build a foundation in some respects because they are too high level. It is much easier to shift from C/C++ than the other way around. C/C++ require more work than C#/Java because less is done for you as it is less abstracted; school should present you with the hardest of circumstances as it is easier to adjust. Additionally, note that languages that do not fit directly with the curriculum of a particular class should be part of a general programming languages course. This course would include languages like C#, Fortran, Pascal, SmallTalk, etc. Note that as well, even though LabVIEW is intended more for engineering applications, it would be good to teach graphical programming in schools so that students will at least know that it exists. It is important to note that while learning programming is important, it's more important to learn Computer Science (different) in school.
construed as flirting.
That may be the point, or maybe not. What level is your current WOW character anyway, how much grinding time do you need before the next raid?
I spent mega hours/days/weeks on MUDS back in the day. Then I met the woman who would become my wife, and soon the mother of my children. It all started with some flirting.
I only look human.
My mother is a halfling and my dad is an ogre, so that makes me an Ogreling
The amount of people in my computer applications (software engineering) course that have no interest in computing is hillarious. I honestly feel that if students have a genuine interest in their course, then it doesn't matter what the course is teaching them as they will be able to teach themselves fairly well.
Lots of the people without any interest are doing the course because "There's loads of money to be made", "It's the thing everybody is doing", "I didn't qualify for any other degree course".
On the content of the course side, I can't really say, as I'm new to the field in comparison to people who did it 20 years ago. It's very interesting to be reading this discussion though!
You need to know how to identify the WRONG way to do something, and be capable enough to do them the RIGHT way.
Don't make 100 strings when you can use 1 array. Normalize your tables. Plan before coding. Use functions more often for things that should be separate and distinct. Read thedailywtf.com and you'll realize that every company has bad programmers. You will impress your boss and others if you can write code that works better than what's running now.
Have an interest in programming.
Lackluster employees in the department just code because they have to. They have no desire to complete the project other than the bonus. They know antiquated ways to program and are stuck in mind-sets. This sounds like a PBS special, but a young fresh mind is very valuable, especially if you like programming. The best programmers in our department are the ones who do it at home. The ones who do it as a hobby because they are always trying to expand their knowledge and look for additional/better ways to do something.
When modding "Informative", please make sure it both has a source and IS actually informative.
Anyone getting out of College is going to be (disillusioned) for a bit. Swimming around for a good job. you'll probably first get indoctrinated by big companies as entry level recruit (level E or F) where they will pay you crap and focus more on molding you to their 'culture' and 'brand name' of douche bag. You'll have to learn much of your skills as you are working (sorry if companies don't like to here this). It doesn't matter what you are learning as everything applies. And by your 5th or 10th job/project you'll be a salty dog and you'll be ready for any programming job around. I guess I would be considered a low level programmer (Coldfusion|Fusebox|jQuery)...and yes I have had problems finding the exact skill to job matches, but as one person told me...Specialize and try not to be a jack of all trades.
Tip: Get arcGIS experience with Java as there is a shortage right now.
Good Luck, Frank
... hacking and nunchuk skills is all you need to get ahead in life.
oogly boogly!
Learn the tools
And then learn the process (submit a bug, verify it, analyze it, patch it, test patch, submit patch, review patch, apply, test release, release etc.). I've met dozens of starters in the field who have no idea what the software life-cycle process is, nor the tools that are used to handle it. While the specific tools don't matter a whole lot, the problems they solve are common. If you intend to write code for a living, this is stuff you'll need to know. I don't typically interview people for entry / junior positions, so maybe they're not looking for this kind of stuff. But I know that I absolutely am looking for it when I interview for intermediate / sr positions.
I think the most important skill you should take away from University is the ability to think and learn. You could learn every language on the planet (you'd have no personal life) but that may not help you get a job if the person you're interviewing with initially is in HR. Learn to sell your skills as opposed to what syntax you prefer. You've covered the basics, so be proud.
If you think learning C will improve the security of the software you write, you are totally misguided.
In C you not only have memory handling bugs: dangling pointers and memory leaks. You also have buffer overruns, which are even more common.
Learning to use serious languages like Java that were designed from the start to avoid memory handling bugs and buffer overruns, you can concentrate in avoiding other *more insteresting* bugs. Besides in Java you have tools like JUnit that help write better code, almost bug free, and which is easy enough for developers to learn in a few hours.
Saying you need to learn C to be a better software developer is like saying you need to learn COBOL to program better business programs. Both C and COBOL are the past. About 20 years ago it was almost impossible to get a job that didn't involve COBOL or FORTRAN. About 10 years ago it was Visual Basic and C++. Today it is Java and C#. Probably in the next 10 years it will be Scala and Erlang.
Who cares really? You need to learn languages to learn concepts. Learn Smalltalk, Lisp (and its cousins ML and Haskell), Forth and Prolog. All the rest of the languages are just *baggage*.
If no one else has said it already - the key skills they need are numeracy, literacy and critical thinking. Everything else can be learned later.
Sara
Designer, Gamer, Macgrrl in an XP World
Comment removed based on user account deletion
Comment removed based on user account deletion
there is plenty of companies out there that are lining up to do that for you. Try to get skills in modeling, TDD, DDD, some people skills etc (or whatever you think is great). You'll thank yourself after two or three years doing boring courses, getting certified (for crying out loud) etc.
Really, the last thing you should worry about is basic skills in a specific language or you'll end up like a derailed COBOL programmer in 20 years.
Show a man some news, distract him for an hour. Show a man some mod points, distract him for the rest of his life.
I'm a developer in silicon valley working on semantic web applications here at moffet field. I did an MS in CS and engineering from a top school and a math/cs double from a normal state uni. I've been promoted up through my jobs over my few years in industry, moving from the midwest out to here with significant pay jumps each time. First, you need to decide what you want to do: do you want to be a developer or something else? If you want to be a developer, forget about all this low level nonsense about assembly code and C. It's totally useless in today's market. Computer programming is all about adding abstraction layers so that you don't have to worry about low level details. You need to build a coding portfolio so that you can prove that you know your stuff. Write a basic web2 app in ruby or java or whatever you are most familiar with, and try to make it as scalable as possible. Deploy it somewhere and let people poke at it. Check out dice.com and craigslist for silicon valley, and if you aren't in a major city get there as fast as possible - you want to be doing development, not maintenance on old legacy code. That means you need to go where the money is at. Of course, you could always be a sell out and just go work for google... If you are worried about knowing what to do? Study mathematics and algorithms extensively, particularly the Cormen textbook. Udi Manber's book is also very good. This will teach you the computational aspects of CS. Then, read up on RDF and the semantic web to get a background in data management. Then practice, practice, practice.
|33t $ki||z of course
Give up on learning anything technical in school. The technology changes too fast for most schools to come up with working curricula in time, and when they do get that figured out, it's not enough knowledge to help with a job. Learn business, management, maybe some financial or accounting stuff in school. In your personal time, try to learn as much as possible. Learn a few things *really* in depth, but also remember that variety is good. If you're mostly a Java person, learn a bit of Python or PHP, and get some Unix knowledge. Take a look at: http://www.inter-sections.net/2007/11/13/how-to-recognise-a-good-programmer/ Also remember that job experience is good, but personal experience is good too. Make some contributions to F/OSS projects or start your own.
You seem to be getting a good technical education. As long as you know one computer language well it is not all that hard to pick up additional languages. Since you already know more than one language I wouldn't be overly concerned about not knowing lower level (closer to hardware) languages like C and Assembly.
Of course you need a strong grasp of software engineering fundamentals and this should include knowledge of: data structures, algorithms, compilers, operating systems, object oriented programming, AI techniques, architecture (both sw & hw) etc.
Beyond the standard curriculum here are a few things that I consider important:
I believe that each of these soft skills can be acquired just as well as the technical knowledge that you are picking up. One of the good things about being a student (and as your post indicates) is that you know you have much to learn. If you can maintain this willingness to learn later in life you will have a successful career whatever you do.
hehe
well, me ,as a 2nd year computer science student chose to study those subject which are somehow related to my course.. for example, they taught us database, i studied webpage programming. they taught us java programming, i studied mobile java programming. they taught us c++, i studied symbian c++. they taught us how to create circuits, i studied how to troubleshoot PCs. you should broaden your knowledge about what is being taught to you to the point that it will become usefull. school is just opening the gates, but its up to you to struggle your way in..