| Hola. 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!