• Advertisement

Should i stop learning C# and focus on C++ for the long term?

Recommended Posts

My short-term  goal right now is a job as a Junior Programmer in any game company, just to get my foot int the door and start earning some income.

My long term goal is to Programme for bigger more established  game companies and help games that interest me.

Im in semi-fortunate position where i don't have to work a full time job so i have the  learn how to programme.

i did my research into whats a good beginner way to start,  Unity and C# came up a lot, so i threw my hat in.

For the past 5 months i've been learning C# and Unity using the udemy tutorials at a slow but steady pace as i come from a 0 maths/ programming background.

Right now  getting the hang of things , understanding most code and the  unity engine to a point where i feel comfortable at my current level around Beginner/ Intermediate.

Although im still keen to continue with Unity, I cant help this nagging feeling that(lets say for arguments sake i do actually get a job) if i do peruse this path and end up with a job as a developer for a company that uses Unity or whatever else uses C# . There is going to be a point at however many X years down the line i am, im still using unity,  im going to be in a position where i want to work on bigger more mainstream games that use C++.

I want to get a job ASAP, i know it will take at the very least another 7 months probably, learning more code, making a portfolio and all the rest, so i dont really want to change and start from scratch again.

Im not bashing unity but it looks like its main use is mobile games, which would be perfectly fine as a starting point, but not as a long term career. 

Hypothetically  If i continue to focus on learning C# / Unity to reach my goal, and at some-point i want to move into bigger prospects and learn C++, how screwed would i be if i wanted to transition over.

Im by no means a  smart guy that picks up things fast, im just willing to put in the time/effort.

Should i scrap learning C# and unity for C++ / Unreal  or just power on through and transition later down the line after i get some experience first.

Time is a factor, but i want to make sure im not condemning myself to a path i wont like later down the line...

 

 

Share this post


Link to post
Share on other sites
Advertisement

Regarding learning the language, I recommend learning both.  

There are many languages used on game software. C++ is generally used in systems-level work and game consoles. C# is used for game script in several engines including Unity and various smaller in-house engines, plus it is used in many tools.  Java is used in many tools and on game server-side processing, and for some things in Android programming.  JavaScript is used in web games, as are systems like Angular and Ruby and PHP and Drupal and many more besides. Python is used in many build scripts and a few tools. Swift and Objective-C are used in Apple's MacOS and iOS environments.

Game programmers aren't expected to know all of them, but generally should be comfortable with a few. When you are just starting out, a student or junior developer, a game company expects you to be reasonably competent in the language they hired you to work in.

 

Regarding the job hunt, this depends almost entirely on where you live.  You don't exist in a vacuum, and a mix of your competition and the employer's expectations are the dominating factors.

In some regions you will need a 4-year degree and a strong portfolio of practice projects. In other regions a degree alone, or a few years of advanced study in computer science. In other regions you need only your own evidence that you can write some code.

 More education is always preferred.  There are many things that are difficult to learn on your own, many topics you will not know that you are ignorant about. There are topics you will not choose to study, a formal degree requires you to gain competence enough to pass the required courses. Most people will spend the time to learn topics that interest them, so that's often not a big challenge for education. 

 

Regarding Unity's usefulness as a platform, it is not just for mobile games. There are many bigger games on the PC and other platforms that use it. However, it is not yet up to the same level for AAA games.  Unreal has been used for a few, but even that requires work and heavy customization in the AAA space. Learning to use it will be good if you are looking for work at a studio that uses it. It won't be useful if that is your only skill and the studio doesn't use it.

 

Whatever happens, be mindful that your value as an emplyee is directly related to your relevant skill set.  If the company changes direction -- which they frequently do -- you need to have the skills the company needs if you intend to keep working there. If your only skills are C# script in Unity, your utility at the company is severely limited. Companies rarely invest in training their workers these days, programmers are expected to learn on their own.  Unless you're in a location where programmers are extremely rare, the company would likely dump you in favor of someone who already developed those skills.

Share this post


Link to post
Share on other sites

Keep in mind that a lot of things you learn coding apply to all languages, or at least most of them. Even if they don't for whatever reason, the experience still helps you learn much faster. It would be easy to argue that if you say, were very advanced in C++ then picking up Java or C# would be much less confusing than starting from scratch would be. That said, it is of course good to experience a few languages, as there tend to be commonalities between certain languages.

Share this post


Link to post
Share on other sites

If your main focus is on getting a job soon(ish) then I'd recommend continue to learn and master C# and when you feel like you're at a high enough level, get a job that uses your C# and Unity skills.

You make it sound like if you start working with Unity/C# you'll be stuck there, but that's not the case as long as you can spend some free time on your own learning C++ once you get that job.  As was mentioned, a lot of what you learn in C#/Unity will apply to programming games in general, so you're not wasting time at all.  And, even if you eventually get a C++ job, knowing C# will be an asset.  You might even find a great job using all those skills, Unity + C# + C++ + whatever else.

But the main takeaway should be that you shouldnt stop learning and improving your skills once you get a job.  If after you get that C# job you devote time to learning C++ and doing small hobby projects with it, then eventually you will know enough to try to get a job doing that... and by that point you will have much more experience in with general programming and game development.

I would also recommend working on your 3D math skills and one or more areas of specialization such as graphics, physics, AI, audio, tools development, etc.  The good thing is that you can work on these things as you learn C#/C++ by just picking the right small projects to learn those languages.

Share this post


Link to post
Share on other sites

IMO if the question is ever "should I stop learning..." the answer is almost always no.  A deep understanding of any one given thing can be valuable.

That being said, given your stated goals, I think you'll want to learn C++ for sure.  I started with C++ before C# and I feel like C++ left me with a deeper understand of what I was really doing, and those skills were transferable to other languages.  C# of course also will give you transferable knowledge you won't get from C++.  So, the takeaway is to try to learn both, but don't abandon either.  But also learn other things if/when you have time.  Learn some scripting languages (Javascript, Lua, etc), maybe learn some web dev (dive into Node or PHP or something for a bit, build a game in HTML5, make some websites that do cool things), learn some graphics languages (OpenGL/DirectX/shader languages) if you think that's a thing you'll want to dive into.  Get a working knowledge of how to use source control.  Learn how to automate some of your tasks, or create automatic nightly builds, etc.

In other words, aim to continuously add new knowledge to your skillset.

Share this post


Link to post
Share on other sites

A deep understanding of any one language is more valuable than a beginning understanding of several.  That being said 75% of what you learn in one language is transferable to all others.   I think most people consider C++ (my primary language) to have an advantage over the others because of it provides access to low level programing and this allows you to design your own paradigms for programming systems as well as applications.  Where most other languages are somewhat bound to the conventions set in place by their standard library.  I imagine that in a development environment where creative use of system resources is in demand C++ may be the preferred language as C# or other languages might be considered to have too much excess baggage to be desirable.  However, I am certain that the industry has work for programmers using high-level languages. 

Share this post


Link to post
Share on other sites

I recommend the same approach to programming languages and game engines as I once heard recommended for musical instruments.  Don't try to pick the right one first - you couldn't possibly know the right one, because the right one depends on the year, you, your friends and culture, and many other random things.  Don't try to learn them all - all knowledge is good, but knowing how to right a for loop or render a sprite in 17 different languages/game engines doesn't make anyone happy.  Instead here's my guidance:  Pick one, based on the amount of info you can gather in less than 1 week of research (you have probably already reached the point) ... the goal is just to find the very first one that feels interesting to you as you put your first 2-10 hours into it.  Javascript, C#, C, C++ ... those are my first recommendations for your stated goal ... although python, ruby and Java are also viable, since your first goal is really "learn to program and have fun doing it".

Then don't every think "I need to learn another language or switch languages" just for no reason.  There are 3 reasons to learn a new language or game engine ... don't do it until 1 of these applies to you:  1) you feel like you've run into a wall with your current situation, and even after trying for weeks, you aren't having fun or making progress with it, 2) you have friends, coworkers, or online groups that are using another technology and you'd like to join them, 3) you are ready to actually begin applying for real jobs soon, and you want to start learning the technology actually used in the job your seeking.

A professional flute player speaking about advancing from $300 to $700 to $2000 to $20000 flutes said (paraphrased):  You can do everything on the $300 flute that you can do on the $20000 flute, it just takes a little more effort, and anyway when you are starting out, you aren't even ready to begin trying those things.  Start with the $300 instrument, and stick with it until you feel like it is holding you back, you will know if you need to move on to a better instrument.

Share this post


Link to post
Share on other sites
On 12/6/2017 at 12:44 AM, Satharis said:

Keep in mind that a lot of things you learn coding apply to all languages, or at least most of them. Even if they don't for whatever reason, the experience still helps you learn much faster. It would be easy to argue that if you say, were very advanced in C++ then picking up Java or C# would be much less confusing than starting from scratch would be. That said, it is of course good to experience a few languages, as there tend to be commonalities between certain languages.

I agree with this 100%! Over 15 years ago I started in BASIC (Visual Basic 6), and even made some 2D games using it, then moved onto DarkBASIC shortly after. Completely hated the experience and decided to go down the hardcore approach and learn C++. Once I was at the experienced level in C++ and could program 2D game engines, I could pick up any other language with ease, it was like the domino effect. It's allowed me to develop on Android, iOS, Windows, ect... without having any restrictions.

The hardest part in programming when I started wasn't knowing syntax, or how to call functions, it was how do I put all of these tools together to create something. The language itself is just a tool, but your ability to problem solve and blueprint applications in your head will take you a lot further than just knowing every single function call in the standard library of a given language. This is why your abilities become universal, and you're able to adapt from language to language easily once you've hit that level.

If you're spending a lot of time with C#, stick to it! It's way better to be very good at one language than to know three at a basic level, which makes your skill level too low for commercial work. The amount of time you would need to invest in C++ might be too long for you with a 7 month deadline. I wouldn't drop C# to take on C++ because you want to work on C++ games, the truth is when you get hired as a JR, you're not coming in as a C++ game engine programmer. You'll be doing some mundane tasks, and will have to prove your worth over time. Stay with C#, build a good portfolio, and learn C++ on the side once you're ready and have at least landed a job.

The biggest misconception I find when people get out of school is they think that learning is over... Programming is an on going thing, and those that are always updating their skills, and adding to their known programming languages are the ones excelling. You're going to have to learn C++ anyhow at some point if this is the direction you wish to take, but with the given time you would be better off continuing with C# and working on that portfolio. You're objective isn't to get to the end of the race on the first sprint, it might take many years to land that dream job, but it's the little steps you take each way that add up to give you your end result.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Advertisement
  • Advertisement
  • Popular Tags

  • Advertisement
  • Popular Now

  • Similar Content

    • By Alexander Nazarov
      Hello. I'm newby in Unity and just start learning basics of this engine. I want to create a game like StackJump (links are below). And now I wondering what features do I have to use to create such my game. Should I use Physics engine or I can move objects changing transform manually in Update().
      If I should use Physics can you in several words direct me how can I implement and what I have to use. Just general info, no need for detailed description of developing process.
      Game in PlayMarket
      Video of the game
    • By Dave Haylett
      Hi all. My project is coming along wonderfully, and am starting to consider alpha deployment, and would like your advice.
      My project need access to 10,000 small PNG image files at runtime, each is only a few kilobytes each, which during development I used to load in directly from a fixed path on my HDD whenever one was needed (obviously not a solution for go-live), using something like this:
      img = new WriteableBitmap(new BitmapImage(new Uri(@screenshotsPath + filename)));
      The image would then be blitted onto a buffer screen, etc. etc. At a time, a few dozen would be being used.
      Now I'm thinking about deployment, and also when I produce an update to my app, there could be more images to add to the folders. So I'm considering the best way of a) deploying the images to the user as part of the project, and b) how to most easily handle updates to the app, whereby more images will be added.
      I have just experimented with adding them all as a Resource (!). This inflated the exe from 10mb to 100mb (not a major problem), increased the compile time from 3 secs to 30 secs (annoying), increased RAM usage from 500mb to 1.5gb (not a major problem either), but means that it solves my fixed directory issue, distribution issue, and update issue, simply by having the files all stuck into the executable. Here's the new code I'm using:
      img = BitmapFactory.FromResource("Shots/" + filename);
      The next thing I was going to try was to mark them as Content > Copy if Newer. This would resolve the executable size and RAM usage (and also the directory issue as well), however it seems that I'd need to highlight them all, and move them from Resource to Content. As an up-front job this isn't too bad, but as I add new images to the project, I'll need to go in and do this every time, which gets annoying, as the VS2015 default is Resource. Also, I'm not sure how this would work in terms of updates. Would something like ClickOnce deployment recognise new PNGs and install them to the users?
       
      I also have 3,000 ZIP files (~500kb each) which also need deploying and updating in the same way. These are currently read directly from my HDD until I can find a permanent solution for adding these to the project as well.
      Can anyone thing of a better way of doing what I'm trying to achieve?
      Thanks for any help folks.
       
    • By GytisDev
      Hello,
      without going into any details I am looking for any articles or blogs or advice about city building and RTS games in general. I tried to search for these on my own, but would like to see your input also. I want to make a very simple version of a game like Banished or Kingdoms and Castles,  where I would be able to place like two types of buildings, make farms and cut trees for resources while controlling a single worker. I have some problem understanding how these games works in the back-end: how various data can be stored about the map and objects, how grids works, implementing work system (like a little cube (human) walks to a tree and cuts it) and so on. I am also pretty confident in my programming capabilities for such a game. Sorry if I make any mistakes, English is not my native language.
      Thank you in advance.
    • By Ovicior
      Hey,
      So I'm currently working on a rogue-like top-down game that features melee combat. Getting basic weapon stats like power, weight, and range is not a problem. I am, however, having a problem with coming up with a flexible and dynamic system to allow me to quickly create unique effects for the weapons. I want to essentially create a sort of API that is called when appropriate and gives whatever information is necessary (For example, I could opt to use methods called OnPlayerHit() or IfPlayerBleeding() to implement behavior for each weapon). The issue is, I've never actually made a system as flexible as this.
      My current idea is to make a base abstract weapon class, and then have calls to all the methods when appropriate in there (OnPlayerHit() would be called whenever the player's health is subtracted from, for example). This would involve creating a sub-class for every weapon type and overriding each method to make sure the behavior works appropriately. This does not feel very efficient or clean at all. I was thinking of using interfaces to allow for the implementation of whatever "event" is needed (such as having an interface for OnPlayerAttack(), which would force the creation of a method that is called whenever the player attacks something).
       
      Here's a couple unique weapon ideas I have:
      Explosion sword: Create explosion in attack direction.
      Cold sword: Chance to freeze enemies when they are hit.
      Electric sword: On attack, electricity chains damage to nearby enemies.
       
      I'm basically trying to create a sort of API that'll allow me to easily inherit from a base weapon class and add additional behaviors somehow. One thing to know is that I'm on Unity, and swapping the weapon object's weapon component whenever the weapon changes is not at all a good idea. I need some way to contain all this varying data in one Unity component that can contain a Weapon field to hold all this data. Any ideas?
       
      I'm currently considering having a WeaponController class that can contain a Weapon class, which calls all the methods I use to create unique effects in the weapon (Such as OnPlayerAttack()) when appropriate.
    • By LifeArtist
      Good Evening,
      I want to make a 2D game which involves displaying some debug information. Especially for collision, enemy sights and so on ...
      First of I was thinking about all those shapes which I need will need for debugging purposes: circles, rectangles, lines, polygons.
      I am really stucked right now because of the fundamental question:
      Where do I store my vertices positions for each line (object)? Currently I am not using a model matrix because I am using orthographic projection and set the final position within the VBO. That means that if I add a new line I would have to expand the "points" array and re-upload (recall glBufferData) it every time. The other method would be to use a model matrix and a fixed vbo for a line but it would be also messy to exactly create a line from (0,0) to (100,20) calculating the rotation and scale to make it fit.
      If I proceed with option 1 "updating the array each frame" I was thinking of having 4 draw calls every frame for the lines vao, polygons vao and so on. 
      In addition to that I am planning to use some sort of ECS based architecture. So the other question would be:
      Should I treat those debug objects as entities/components?
      For me it would make sense to treat them as entities but that's creates a new issue with the previous array approach because it would have for example a transform and render component. A special render component for debug objects (no texture etc) ... For me the transform component is also just a matrix but how would I then define a line?
      Treating them as components would'nt be a good idea in my eyes because then I would always need an entity. Well entity is just an id !? So maybe its a component?
      Regards,
      LifeArtist
  • Advertisement