Ask HN: C# vs. C/C++ as career forward.
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? C# is easy compared to C++, you'll like it. 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! Once you know C++, learning C# is a breeze. I learned it myself last year by going over the C# Reference [1] and scanned through all the documents only stopping for new syntax or concepts. I then installed ReSharper and learned a bunch more as I was using the language. 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. I couldn't agree more. C# is Java-like, and could only be a addition to your skill set. Especially now that MSFT has put it out to the OSS community. .NET! 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/ As someone who was described as having "an interesting career path" by his manager due to simultaneously developing Windows device drivers and GUI code, I say learn C#. 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. > 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. Fully agree. 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. Care to elaborate? I'm early in my career(24), love embedded systems, but I just don't know if there are good jobs available in this industry for young people. Could you give more info? C# for Windows device drivers? Huh? How are you even going to handle an ISR (interrupt service routine, IRQ) or a DPC with C#? Or DMA, etc.? 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. Not sure where you got that from anything I said. I am surprised to hear that the market for device drivers is shrinking. Is it because hardware is becoming more homogenous? A lot of earlier work in the area was due to many companies building their own hardware that ran on internal PC busses. Now most of them have found that USB is responsive enough,so the driver work on internal bus devices is down. In addition, Microsoft has made it increasingly easier to develop drivers and including more of the stuff you previously had to do yourself as part of the Device Driver Kit. What is the C# role doing? Is it moving your career/knowledge forward in any way (other than learning C#)? 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. I think you pointed out my only concern quite well. 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#? Java gets quite a bit of use in ML as well. C# is used a lot in health sciences. I really love C# but it seems like a poor fit for doing what you really want to do ("get more involved in machine learning, data analytics, scientific computing"). It seems like a detour and not a step toward your goal. Can you please elaborate? 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 would look on Indeed.com or some other job board for the jobs that fit what you think you would like to do and then look at the what languages and technologies they are asking for. 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. "I would really like get more involved in machine learning, data analytics, scientific computing" - this doesn't sound like C++ at all. Why? 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++. OK, you probably know more than me. I just assumed that most of those libraries are then consumed from something like Python. If you want to develop high-performance libraries themselves, then C++ is probably the way to go. Unless you want to be on the cutting edge with something like Rust :). Getting a job to develop with Rust would be a dream :) don't take that embedded job, don't become "C# only" either. if u want to do big data later, try to learn Java/Scala/python on the road and do some projects. Going forward, 2-3 years, I would really like get more involved in machine learning, data analytics, scientific computing. 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). > graduate to F# This is condescending to C# programmers when F# is nearly the same language. 3 reasons why the C# type system is broken, and how F# improves the situation
@ https://zeckul.wordpress.com/2015/02/05/3-reasons-why-the-c-... It's quite a different and useful language but definitely not a better one. You have to be forgiving, as F# is struggling to get more traction, especially in terms of tooling... No ReSharper, no CodeRush, no Roslyn. But I've heard that F# compiler implementation is quite elegant - that's something, right? I have never understood this 'No ReSharper,...' argument. I've been writing C# for 10 years and the times I've used ReSharper it's just got in the way and is slow as hell. Effective C# development doesn't require ReSharper. CodeRush? I have literally never heard of it. So again, clearly not essential. No Roslyn? What? No C# compiler? Of course F# doesn't have Roslyn. Until very recently C# developers didn't have Roslyn either and they managed to develop software just fine. So clearly not a deal breaker. F# is a fine language, and because of its heritage doesn't come with the mistakes that were built into C# because of its C++/Java heritage. 'Better' is clearly subjective. I subjectively find F# better than C#. The OP is clearly interested in machine learning and the like, which would be much, much, easier in F# than either C# or C++ (not that they can't do it, mind). I'd be a lot more willing to get on board with the former part of that sentence if you hadn't blundered into the latter bit. Paul Graham was right again. http://www.paulgraham.com/avg.html And Chinese is nearly English.