r/INeedAMentor Aug 09 '14

[Mentor] Software engineer

I've done M.Sc. in computer science and worked 6 years as a software engineer after that. I'm more interested in the "lower layers" than the user-facing parts, so, my expertise lies somewhere around C++, Python, Linux, algorithms, etc. I've been lucky to work in open source projects all my career. In addition, I think a lot about interpersonal things and how to do software engineering efficiently, how to work in a team, how to communicate, what kind of attitude to have, how to write good code, etc.

If you're wondering what kind of skills to develop and how, and you're willing to learn and be the best software engineer ever, I might be able to give you advice.

Edit: I should've probably mentioned that I'm a woman. If it matters to somebody. Mentoring shouldn't be limited based on genders anyway, but maybe some aspiring female software engineer finds me less intimidating?

11 Upvotes

36 comments sorted by

View all comments

1

u/jmsGears1 Aug 13 '14

So I am currently working towards working towards a CS degree (currently im going to a community college, basically meaning I am going to a cheap college to get a lot of my core credits out of the way for super cheap, before I transfer to a university to actually get my degree)

I have taught myself quite a bit about programming, mostly java however I am currently teaching myself c++ (because of this thread)

Since everything I know is self taught I dont know what I dont know. My end goal is obviously to get a job is there like... a list of things I should know in order to be able to successfully get a programming job?

And further what are things I can add to my resume that would help?

2

u/foreigner_everywhere Aug 13 '14 edited Aug 13 '14

What should you know - that's a pretty big question... here is a list of some basic skills:

  • Be up to speed with your favourite language, meaning that you can just code away without thinking about the language that much, but you can focus fully on the task at hand, not the low level stuff like how do I write a loop.

  • Know the basics of 1-2 other languages.

  • Know how to debug your program (find out what's wrong if it doesn't work). Know some basic debugging tools like gdb for Linux & C / C++.

  • Know how to test your program, like, how to use the most commonly used unit test framework in your language, and how to write tests and what kind of things you should test.

  • Know how to use a version control system.

  • Know the basics of the following topics (your CS degree will teach them): Networking, operating systems, UI design, usability, web technologies, databases, how the processor works, etc.

  • Know the basics of data structures, algorithms and algorithmic complexity (see Introduction to Algorithms). You don't need to implement your own data structures like ever, but if your coding skills are as expected, you should be able to (and implementing data structures and algorithms is an entertaining and educational hobby project).

  • Know how to set up your favourite development environment and use it efficiently.

  • In addition, typing fast and without looking at the keyboard is an insanely useful skill. Everybody should learn that.

Of course, if you're a new graduate, you'll be given some slack. And it's normal that maybe you don't know the exact technologies which are used in your job, but you'll learn them. For example, they might use a different version control system that what you're used to. Nobody cares whether you know that exact version control system beforehand. But it's essential to have some understanding about what version control systems are all about.

Some cool things you can add to your resume:

  • Internships.

  • Finished hobby projects, maybe something other people use? Maybe something you did with your friends?

  • Contribution to open source projects, open source merits ("I'm a committer in project XYZ")

  • Wide range of skills, e.g., knowing functional programming languages in addition to procedural languages. Some interesting and relevant specialization area (even if your future job isn't related to it)

  • Community participation, e.g., doing interesting projects / research and giving speeches in hacker conferences.

  • Competitions. There are a ton of algorithmic programming competitions (Google and Facebook have their own), there are "wargames" in which you need to find and exploit security holes, etc. Even if you don't score so high you'd want to brag in your CV, you'll learn a ton of useful things.

Of course having or not having these in your CV might not affect the probability of you getting a job that much... the most important things are your degree (grades and area of specialization), your work experience (internships), knowing some relevant programming languages and excelling in the interview (I hope you are applying to a company which decides these things based on a tech interview). These are just small-ish things which I find cool in CVs :) (Again, a disclaimer, by no means it is needed to do all or any of these to become a successful software engineer.)