A few ago, as a grad student I was a heavy MATLAB user, working with signal - image processing, machine learning, etc. I got a job and am doing ~ 2 years of experience as a driver developer (C/C++) and think it is pretty cool. I am still learning lots of new things everyday.
Now, I am at crossroads at work - I have to choose between taking up a C# developer role and C/C++ (focused on driver development) role. I don't have any prior C# experience; other language which I currently work as my side projects - Python.
Going forward, 2-3 years, I would really like get more involved in machine learning, data analytics, scientific computing. That being said, I really like my current company and would like to be here for a while (~1-2 years) before embarking on other ventures.
My question - With my current skill set, future thoughts, what should I choose - C/C++ role or C# role? My reason for asking this community is that I have no experience with C#. I didn't have a CS background so I am slightly wary about trusting my own judgement in such cases.
Thanks :)
Edit: To clarify, I am not opposed to C# or any language at all, just want to sure I wouldn't pigeon hole myself.
Another question: If I know C# (as opposed to only C/C++) how related would be Java?
It's a different matter whether it will truly develop your skills when it comes to your goals. C/C++ role is guaranteed to develop you more and give you better understanding of the underlying hardware for machine learning, data analytics and scientific computing than C#.
If I were you, I wouldn't pick just one of anything when it comes to software development. Sure learn C#, but don't become a one trick pony.
Looking at your goals: Learn the tools, technologies and libraries related to your interest, be it OpenCV, R, Fortran or whatever. Write proof of concepts and experiments on your free time. Reinvent the wheel to learn.
But also learn how the things you use work underneath.
When dealing with large data sets, you can't do it with just one system. You need to distribute it over a larger set of systems. Learn about clustering, distributed systems. In other words, algorithms like Paxos, MVCC, vector clocks, etc. Hardware side of it: RDMA and NUMA (to some extent). Especially learn how to deal with latency! Find the rest yourself. Google is your friend. :-)
Also learn how to push the hardware to the max. Some things you might need to deal with: NUMA, cache coherency, cache agnostic algorithms, SSE, AVX, OpenCL and CUDA. Don't forget to take a look at the source code of that amazingly fast library.
The items listed was just what came to my mind immediately, there's a lot more of topics to cover!
Without a doubt, C# is a much, much cleaner language. If performance or low-level systems programming isn't your main concern, I'd say go with C#. Compilation times are much better, the garbage collector makes many things much easier to use and you still work in a statically typed language with powerful type inference.
One neat thing about C# is that its a hosted language, the CLR can also run F# and Clojure to name only two, both of which can interact directly with C# code.
Ultimately, the choice is yours. I'd suggest trying it for a week or two and by then you'll have a better idea which you prefer.
C# - Project Orleans -> http://vimeo.com/113730934
F# - Path to relaxation -> https://www.youtube.com/watch?v=s_iMgFAY0lk
Xamarin - iOS/Android/Windows Phone apps using F#/C# -> http://xamarin.com/
The availability of device driver writers is shrinking rapidly, as my search for one in the last year proves. However, it's shrinking because the market is shrinking. Might be more accurate to say that the market has already tanked. At the same time, the market for C# devs is exploding.
The good news is that you can make $$$ as a consultant writing device drivers, the bad news is that those gigs are likely few and far between. With your background in signal processing and MATLAB and good C# skills, you'll have opened doors to some interesting opportunities. A friend of mine with a similar background just started a machine learning gig and he's enjoying it.
Take the C# job and learn the language. I love C/C++, but it's getting harder to find work in that language unless you want to focus on embedded systems.
It's getting harder even if you do want to focus on embedded systems. I see the hiring bars for those positions getting increasingly higher, to the point where it is almost impossible to switch in if you didn't start there or back if you took a break.
My employer moved away from C++ projects in the enterprise space back in 2005, into more programmer friendly languages.
In spite all the nice C++11/C++14 features, the enterprise hardly cares for C++ nowadays.
And when it does, the code is most likely pre-C++98, written with MFC, Tools.h++ or similar.
Disclaimer: I've worked with Windows device drivers, and there's no way I can see you could use C# there. Maybe in UMDF, but you certainly can't do anything timing sensitive in user mode. And drivers are often timing sensitive.
It just seems like an odd choice (C#) given what you want to do. Scientific computing is C++, Fortran, and Python, along with some Matlab, R, maybe Julia. A ton of machine learning is in R and Python. Of course Java is heavily used in data analytics due to Hadoop, so C## will help you there.
But really, it's pretty trivial to learn a language. C# is a fantastic language, but it seems that it is likely that your role will be taking you further away from your future plans, not nearer them.
I don't feel super strongly about either choice, other than pick the work that is most interesting, rather than pick based on language. I'm posting mostly because all other replies are pro C# at the moment, and I wanted to offer a contrast.
The C# role is mainly developing application level software which would talk to the C/C++ drivers and such. This C# will be fitted into another framework which is the top level platform.
Can you please elaborate on this "But really, it's pretty trivial to learn a language. C# is a fantastic language, but it seems that it is likely that your role will be taking you further away from your future plans, not nearer them."
As people have pointed out, learning a new language seems definitely like a good addition to the skill set, but I wouldn't want to do it at the expense of pigeon holing myself.
TL;DR: I am not sure if I should become better in C/C++ or pick up C#?
At this point I am unsure if I should develop my C/C++ chops more or learn C# application development and add something new to the skillset.
I've used C# for computer vision, visualization and even for embedded stuff but it really isn't popular for "fun" things and I think it will be even less so in the future.
A lot of ML and scientific computing libraries are in C++. Quite a few of the roles I have see want a solid understanding/experience with C++.
I would recommend the C# experience in so much as it will build familiarity with .NET, and thus allow you to graduate to F#, which is increasingly popular in those fields (and damn good at them).
This is condescending to C# programmers when F# is nearly the same language.
Paul Graham was right again. http://www.paulgraham.com/avg.html