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?"
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.
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.
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.
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
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
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.
These are the six programming languages I think everyone should know. If you have more time after that then learn FORTH (or PostScript if you want a real challenge and like pretty pictures) for a good example of a stack-based language. I'd also consider adding Self, Io or JavaScript (or NewtonScript if you can find a machine that runs it) to that list. You can do prototype-based OO in Smalltalk but it's not nearly as easy as doing it in a language designed for it.
I am TheRaven on Soylent News
As a student who is just about to graduate in 6 months and having secured a job with one company, with about 10 offers from other companies, I would agree that knowing C and memory management is of the upmost importance. For a technical background, knowing your data structures, object oriented principles, and algorithms are also important. I asked how to implement linked lists, tell them what the different parts of different languages' OO properties (i.e. Java vs. C++), and how many bytes some data structure would take up. You need a good understanding of the basic concepts, such as time complexity of almost every basic algorithm (search/sort/iterate) for most basic data structures (trees/graphs/arrays). Always be reading and learning new concepts, not just new tools. Books that will help you are going to be such items as Pragmatic Programmer, Code Complete, Joel on Software, Mythical Man Month, and almost any book these reference.
I think the most awarding experience that I have had during my time in college has been being involved in open source projects. They can teach you just as much about real world working as any co-op or internship can, if not do a better job of it. From my experience, open source projects usually have a much better development cycle then your ordinary company. Being able to talk about two solid projects that were not a trivial school assignment are important. And most open source projects will have politics to deal with, which go on at every aspect of every job.
Finally, think about the people aspect. Working in teams is important, VERY, VERY important! Every single company I went to wanted to know what _team_ projects I had worked on, and how I contributed to that team. Very often, I was asked about the different aspects of working on the team etc. Leadership is a big factor here, being a team leader or showing leadership capabilities is important. You need to be able to be the alpha dog in a pack, although they are going to hire you as a grunt to start.
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.
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.
Communication skills: spelling, grammar, public speaking, etc. If you can't make yourself clearly understood, or if you come off as an ignorant cretin, no one is going to be interested in any other skills you might have. I just had a resume cross my desk advertising a candidate's ability as a "NETW0RK ADMINISTRATOR"...a silly mistake, but if you miss a detail like that on your resume how much are you paying attention to detail on those netw0rks you are supposed to be administering?
Business Acumen: Have a basic understanding of accounting, finance, and economics. Think about how IT/IS makes things happen for an organization, how it impacts the bottom line.
Breadth of IT Skills: You can develop apps in a variety of environments...that's nice. But what do you know about databases, networks, servers, the care and feeding of end-users? Too many developers come up short here and are content to code in a vacuum and it shows in their work.
Presence: Learn to leave the teenage and 20-something mannerisms and slang behind. Workplace email is not the same as your personal IM or text messages. Comport yourself and your writing in a manner befitting the situation. Restrict your use of the word "like" to no more than five times a day.
Hope this helps...
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
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.
indeed. so he should get a bunch of cats, and practice herding.
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.
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'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.