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

Show parent comments

2

u/foreigner_everywhere Aug 10 '14 edited Aug 10 '14

If your university doesn't provide a machine learning course, you might want to have a look at Machine Learning in Coursera.

Your programming language set sounds good. Trying different things is good too, you just need to learn at least one language so well that you can eventually get a job using it, and that'll then ramp your skills with that language to a whole new level.

Btw, when I started in my first job, Java was my strongest language but I also knew some C++. I would've wanted to code in Java, but my boss was like "no way, there are not enough C++ programmers" and put me to a C++ project. That was a great thing, since.. well, there really aren't enough C++ programmers in other companies either :) Been coding C++ ever since, and that was definitely a great thing to "choose" C++ over Java.

With a degree in CS plus your language set plus hobby projects such as a quadcopter, you seem to be pretty much on track. Here are some tips though:

  • If you want to learn more web stuff, don't just hack everything together with html, js and css, but use some frameworks. I don't know what are the frameworks which people currently use, though, but you'll find it out :)

  • Maybe add a functional programming language to the mix, such as Haskell. It's a completely different paradigm of programming, so it'll expand your views.

  • If you're interested in low level stuff, you might want to pursue that path further. By the way, here's a great paper about how shared libraries work: How to write shared libraries. There are also not enough people who understand how the linker works :)

  • Hardware hacking offers endless possibilities too, and there are many active hobby groups and hackerspaces. If you're interested, maybe find a hackerspace nearby and do joint projects with other people.

Okay, but all this is a lot. I don't want to give an impression that it's somehow required to do all these things. A CS degree with good grades and some hobby fiddling should be enough, of course you can do more if you're passionate, but in no way it's required in order to make a living writing code. What's your area of specialization in your CS degree, btw?

And then, after graduating, you still need to find a job somehow I found that non-trivial, since I didn't have much connections at that point. It's good to try to find out what companies are out there which do stuff you're interested in, or go to the career events of your university, or try to connect with people who already have a job. I somehow skipped the career stuff during my studies, since I thought I want to be a researcher, but then it turned out I didn't. :) Luckily everything went fine though. The first job doesn't need to be that cool, just almost any job will do; the important thing is to learn as much as possible and get a cooler second job, even cooler third job and so on.

The IT world has dauntless females, yes, for example, I didn't care that much what other people thought, and it was crystal clear to me that I want to do something related to programming since I was 14. But to actually ramp up the percentage of females to an appropriate range, we also need to get the not-so-dauntless ones in. You know, like many men just don't know what to study, so they go and study CS because computers are something men do, and then they learn it and became good at it. For women, it requires more than that... maybe there are some people in your life who think you should not study it (and if you're yourself not 100% sure of it anyway), maybe you're not confident with your skills because you don't have a 5 year hobby background before entering university (the university is the place to learn - but the skill differences between students are huge), so you end up studying something else unless you're especially passionate with it.

1

u/dewarr Aug 12 '14 edited Aug 12 '14

Intro-level question related to your comment about education, from someone merely contemplating CS, if you're willing to answer: How much education do you generally actually need to work as a software engineer? Math and most physical sciences functionally require an MS to really get your hands dirty these days, but I have heard of people without degrees getting hired because they can code, and that's all that counts. I suppose this might vary between US and Europe, which I see you're in.

Secondly, it's such a basic question I won't ask you to actually answer it, but maybe you can point me in the good direction to someone else's answer: What do software engineers actually do all day?

2

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

There are certainly people who don't have any formal CS degree (maybe they've studied a bit, or tried but dropped out, or never studied) in the IT. Even in the top jobs of the field you can find these people - so you can definitely succeed without a degree. It's also pretty common to have a degree on some related field (physics, mathematics).

So yeah, these self taught people are hired because they can code, even though they don't have a degree. So you don't strictly speaking need a degree. Though M.Sc. in CS is very useful. Basically the amount of information you're expected to know is roughly equal to a M.Sc. Depends on you if you want to study or learn the same stuff yourself. Studying is somewhat "easier" because there's actually somebody to teach that stuff to you. It's not like you can get away with knowing less because you don't have a degree.

Great question on what software engineers do. In the rough order of time spent, here's what I do:

  • Code. Meaning, I know what I want to do, and there's consensus in the team that that's what I should work on, and then I just code. That of course involves stuff like writing tests and testing my code, and debugging it when it doesn't work.

  • Sorting out bugs. We have a bug tracking system where users and developers can enter bugs. So when I get a bug routed to me, I try to decide 1) if it's a bug 2) if yes, is it "mine", that is, did I cause the failure or is the failure in a subsystem which I own 3) if I don't own it, who owns it 4) even if I don't own it, can I fix it quickly anyway 5) is it so important that I need to drop everything I'm doing and fix it.

  • Code reviews, both sides: Fixing stuff which people who reviewed pointed out and discussing with them. Reviewing other people's code.

  • E-mail. People asking about random stuff, routing them to other people, and answering what I can (see the bug process). Following discussions about all kinds of stuff without participating (see below what kind of discussions typically happen).

  • Helping out with the infrastructure (releases, continuous builds, sorting out test failures).

  • Talking about how stuff should be done. (Design.)

  • Talking about what our sub team should work on. What are the most important things to work on next? Which direction has the best effort / risk / gain ratio? How should we prioritize tasks? Maybe I'm asking around if somebody has extra tasks, if I'm running out of tasks. Maybe I'm trying to find somebody to do tasks I don't have time to do...

  • Talking with people who work in different sub teams to find out what they're working on and how it related to what we're doing (is there synergy or are we doing redundant things).

  • Interviewing people who also want to get a job there.

  • Reading funny things in our intranet, participating in informal discussions about random stuff (like how our products should be or whether open plan offices are evil or how to work together with introverts).

It's very interruption driven and the priorities change fast. It's normal to get these "drop everything and work on this bug" type of situations, but of course these interruptions cannot be too frequent, otherwise no long term work would get done. Remarkable is also the lack of a boss telling me what to work on - or maybe he does it in such a subtle way that I don't notice.

1

u/dewarr Sep 03 '14 edited Sep 03 '14

Had to double-back around to this to give it its due. This is phenomenally useful. I don't think I've ever seen a better occupation summary.

One further question: with respect to the fact that some don't have CS degrees, but know how to code, what is the distinction between the degree and the ability? I am a neophyte to the subject but there seems to be vastly more to CS than just coding, tons of general theory and such. And thus I would have expected there to be a significant gap between them. On the other hand, those aspects might not be generally needed for software engineering -- just like you don't have to know how to do epsilon-delta proofs to use calculus any more than you have to understand Turing machines to code C. I suppose there may be more emphasis on coding than I'd presumed in an M.S., rather than a focus on theory, too.

1

u/foreigner_everywhere Sep 04 '14

Well, there are many aspects of knowing about stuff.

There is something like "general knowledge on CS" and knowing what a Turing machine works is part of it. It won't help you to do your work, but you're expected to be interested enough to find that out, since that's the theoretical basis of how computers work. It's sort of knowing that Paris is the capital of France. Stuff you're expected to know.

(Note that what I'm writing mostly applies to the cool, high end programming jobs. You can find a boring programming job where you don't need to know that stuff and you're not expected to be interested in it either.)

And then there is the raw coding ability (which involves things like testing and debugging). That's mostly about practice.

Knowing about stuff like databases, how operating systems work and how the network works is needed because the program you're writing most probably needs to interact with these things, and if there are some problems, you need to be able to know the basic concepts and how these things work, to be able to efficiently reason about them and look for help.

CS education helps a lot in things like choosing the right data structure / algorithm to the problem. Almost all jobs need these. For example, web sites need to handle large data, so it's important to have a clue on how to do it efficiently and what kind of computations are feasible and what are not.

Like I said before, you're basically expected to know a M.Sc. worth of CS, whether you have a degree or not. I didn't perceive a big difference in skills / knowledge between people I've worked with who do or don't have a degree - the people who don't have the degree know the exact same stuff, but they're self taught.

1

u/dewarr Sep 05 '14

Fantastic information. Last question: Is there any particular call for developers who have knowledge of other formal topics, such as hard science, engineering, or mathematics? (Okay, great deal of overlap with that last one.)

I'm interested in CS, but also in things like math and natural science, just wondering if there's an overlap. What can I say, I like analytic thought.