Advancing beyond a (advanced)beginner

Started by
10 comments, last by All8Up 12 years, 4 months ago
Preface: I started programming 2 years ago, maybe I'm not a complete beginner, but I really feel like it.

I started programming by reading books, such as learn python in 30 days, headfirst into C# etc. And these books were great introductions, but then the handholding stopped. I was overly interested in game programming, so I took to things like pygame, XNA, eventually full engines like Unity3D. This was great, I learned how to make games, and got a moderate handle on programming.

But I want to get better at programming. I'm in school for a CS major, but I'm at CC until I transfer to my four-year school, so I'm not really learning anything related to the subject, just my generals.

Have I been babied by things like Unity3D, and high level languages like C#? I have no idea how to manage memory, what data structures are, any advanced algorithms, how to work with a database, or how any network code works. Things like working directly with graphics APIs and shader languages confuse me.

If someone asked me how a compiler worked, or how to implement a scripting engine I'd give them a blank stare. I feel like I've spent all this time learning a game library or engine, and have no real understanding of programming.

Should I just wait to transfer and learn these in my college CS courses, or should I be taking the initiative to learn these sort of things on my own? I have no idea where to start.

Would I become more proficient at programming simply by picking up a lower level language?

Sorry if this seems like a long-winded rant with no real question.
Advertisement
I started coding in my early teens. Then went to college. I learned "the basics"... O(n) means something when u r coding. Also the fundamentals are important.

I've been coding for close to 20 years now and I still code on my own free time outside of coding for work. Take the initiative. No matter what kind of developer you want to be you will need to do stuff on your own outside of a classroom.

What facet of programming are you interested in?

I think u should have an understanding of what n how a compiler works but the serious inner workings of it may not apply to the area you are interested in.

I look at it like building a house. You need a solid foundation to move forward or else you will get crushed.

Hope this helps
Code makes the man
I have been programming for 6-7 years ago(around when I was 10).

It sounds like you are jumping around too much from one area to another. When I began making games I started with game maker and once I was really confident with that I moved onto C++ and I am beginning to get get strong in C++.
I'd just sort of chip away at the things you don't know. Don't worry about how much you don't know, that's intimidating (and really, it will always appear infinite).

Where should you begin? Whatever interests you the most! Greater interest == easier to learn. Learning your current interests will stimulate further interests, and the process repeats...

[color=#1C2837][size=2]Would I become more proficient at programming simply by picking up a lower level language?

[/quote]
More than anything, you would become less efficient.
The only viable reason for picking a low level language like C++ today is if you are writing low level stuff like operating systems, device drivers, web/database servers or the like.
That's what C/C++ was designed for.
Game engines still use C++ today but that's mostly because C++ was the only serious alternative 20+ years ago.

If you really want to learn about hardware by forcing yourself through the quirks of a low level language, I would go for assembly language.
If you want to learn C++, I would go for C++

I find it hard to say either yes or no to your question though. It depends on several factors.
Studying distributed systems at university requires very different tools than writing apps for mobiles, as you can probably imagine

Have I been babied by things like Unity3D, and high level languages like C#?


Not really?


I have no idea how to manage memory, what data structures are, any advanced algorithms, how to work with a database, or how any network code works. Things like working directly with graphics APIs and shader languages confuse me.
[/quote]

Of this, data structures and algorithms are the only particularly important things to learn. Data normalization is a good concept too. And university will teach those.


If someone asked me how a compiler worked, or how to implement a scripting engine I'd give them a blank stare. I feel like I've spent all this time learning a game library or engine, and have no real understanding of programming.
[/quote]

I don't see how compiler theory is associated with 'real understanding of programming'.


Should I just wait to transfer and learn these in my college CS courses, or should I be taking the initiative to learn these sort of things on my own?
[/quote]

Even in community college, your freshman year should be algorithms and data structures. It won't hurt to learn them, but I'd ask why you're not learning them already in the formal setting. You're paying for your education...


Would I become more proficient at programming simply by picking up a lower level language?
[/quote]

No. Knowing more low level details just means you know more low level details. That doesn't provide any more insight really into what is going on, it just means you have to do more work to get anywhere. When you're first starting out a language that does not encumber the programmer (like C#) is best so you can focus on learning algorithms and data structures. Learning how to solve problems and debug code.

Would I become more proficient at programming simply by picking up a lower level language?


Not automatically, Learning a different(not necessarily lower level) language can help you see problems from a different perspective though which can help you become a better programmer.
If you are going to play with low level programming i'd recommend keeping your projects really simple. The game AT Robots is a fun way to learn low level programming(The fact that the hardware is fictional is mostly irrelevant in my opinion, breaking a problem down into simple instructions is an great skill to have and translates to any platform or language).
If you want to learn about Direct3D, OpenGL, Shaders, etc just go for it, if you keep things simple it isn't all that difficult. (Don't try to make Doom14 , Get a triangle on screen, rotate it, texture it, get it to render using a simple shader, etc and build up from there)

You will never learn everything so just explore whatever you find interesting, don't be afraid to try new things.

and once again, keep things simple, You don't have to build an MMO to learn about databases, a web guestbook is a perfect starting point for that, For network code you could try to write a simple chat application, etc.
[size="1"]I don't suffer from insanity, I'm enjoying every minute of it.
The voices in my head may not be real, but they have some good ideas!
Honestly my advice is to solve a problem.

When you make silly little contraptions in your head thats where the value of learning and problem solving comes into play. What I mean is making something completly off the wall and unique to you. Something that you know is a hrm, how would I tackle this? How would a computer handle it. By doing this you set yourself up to fail. Failing sadly is the best way to learn, by failing in a positive manner your going to continue your research and learning.

Heres an example:

Lets say you want to learn more. How can you make a character drawn on screen on a platform and make a platform. Create it. Now that you did that, add some new functionality and ask a question. How can I have the game track the amount of footsteps the character has done and award an achievement based on it. (Now your learning about handling variables over a longer period of time and memmory managment). How can I make it so when the character has the ability to go down a path it rotates the images and shows a side view of the view, or how do I add an inventory system to this platformer. How do I add a score system, howabout a continue screen, lives, fireballs, guns, badguys, a end goal, cheat codes..


I just gave you a good bit of assignments... trying new things will force you to learn. Looking it up online is ok, but try to tackle how you think it would work first. When you have, and you cannot progress come here, ask other programmers to help you, this allows them to learn and see what you got and interact with how you code aswell. Doing this will bring life into the community as well as show you how others in the world learn just what your learning. Hell, you might even build a minigroup and start tackling larger scale projects. In the end.. you will learn something.
I usually just give my 2 cents, but since most of the people I meet are stubborn I give a 1$ so my advice isn't lost via exchange rate.


I'm in school for a CS major, but I'm at CC until I transfer to my four-year school, so I'm not really learning anything related to the subject, just my generals.

Doesn't your CC offer base-level programming courses like CS1 and 2? I started at a community college as well, and had both those nailed down before transferring to the 4year university for the rest.

Have I been babied by things like Unity3D, and high level languages like C#? [/quote]
Babied? No, you've just been able to focus on the larger aspects of programming: thinking like a programmer. You get this practice in any language, and it translates very well between languages.
I have no idea how to manage memory, what data structures are, any advanced algorithms, how to work with a database, or how any network code works. Things like working directly with graphics APIs and shader languages confuse me.[/quote]
Manage Memory: Learn how to clean up what you create on the heap. Managed languages will do this for you (mostly) but get in the habit of remembering to delete objects when they're no longer needed. A C/C++ course would probably touch on this, memory management is directly related to memory leaks.
Data Structures: Should absolutely be covered in your degree courses, that's CS1/2 material. Again, if you can take those two classes at your CC, do it.
Advanced Algorithms: They have their place, usually it's in pretty specific problem domains. If you can take an algorithms course, I highly suggest it, but you'll eventually work with these if you stay in programming anyway.
Databases: Only necessary if you'll work with a database. Learning a query language won't be that difficult though with a programmer's (or mathematician's) mindset. If you want to, take a DB class at uni as well.
Network Code: Is mostly handled for you, all you need to learn is how to use your chosen language's socket api. Your degree will hopefully include a networking course, it's really more the domain of the network admins and Cisco-esque certs though.
APIs and shader languages: get used to learning existing codebases. It's very, VERY rare that you'll end up writing code from scratch, and the ability to sit down with some docs and the source code and learn what functionality already exists is important. APIs are just pre-written code, shader languages just involves learning a new syntax and language. I find with shader language in particular, having a better concept of how the shaders are applied in the rendering pipeline grants them much better understandability.

If someone asked me how a compiler worked, or how to implement a scripting engine I'd give them a blank stare. I feel like I've spent all this time learning a game library or engine, and have no real understanding of programming.[/quote]
Unless you need to write a compiler, that's not very necessary knowledge these days. Scripting engines have their own docs for implementation, and it'll usually take some tweaking to fit it to your project anyway. Protip: even the 20-year professionals consult guides and books regularly. Don't think you should just "know how to do everything", what's more important is that you gain the ability to process new information well and learn how to combine your existing experience and knowledge with new processes and languages, because that's going to keep happening. (I hear that canned response a lot regarding college: It's more about 'learning how to learn' than anything else)

Should I just wait to transfer and learn these in my college CS courses, or should I be taking the initiative to learn these sort of things on my own? I have no idea where to start.[/quote]
Initiative is always good. Start researching the topics you've listed. Just don't spread yourself too thin: if you're bombarding yourself with new material in unrelated topics, not much is going to stick. Read a little, then implement it. With programming it's always better to try writing something that compiles than reading entire books with no application.

Would I become more proficient at programming simply by picking up a lower level language?[/quote]
No, you'd just have a better respect for the speed which you can accomplish tasks in higher level languages ;) It's fun to know what assembly language looks like/does, though.

Hazard Pay :: FPS/RTS in SharpDX (gathering dust, retained for... historical purposes)
DeviantArt :: Because right-brain needs love too (also pretty neglected these days)



[color="#1C2837"]Would I become more proficient at programming simply by picking up a lower level language?


More than anything, you would become less efficient.
The only viable reason for picking a low level language like C++ today is if you are writing low level stuff like operating systems, device drivers, web/database servers or the like.
That's what C/C++ was designed for.
Game engines still use C++ today but that's mostly because C++ was the only serious alternative 20+ years ago.

If you really want to learn about hardware by forcing yourself through the quirks of a low level language, I would go for assembly language.
If you want to learn C++, I would go for C++

I find it hard to say either yes or no to your question though. It depends on several factors.
Studying distributed systems at university requires very different tools than writing apps for mobiles, as you can probably imagine
[/quote]
Unfortunately this is always mentioned and it is almost always stated in an incorrect manner. Moving to C++ can be a step backwards in terms of syntactic sugar (i.e. things sometimes take a bit more typing), though as C++11 rolls out further, it will be effectively C# on steroids so I don't believe that is a viable argument anymore either. So, saying "low level" is completely incorrect, perhaps saying you can shoot yourself in the foot considerably easier, I'll agree with that. As to the game engines, "really"?????? Every game engine I've worked on in the last 10 years starts with C++ and generally limits itself to fairly C'ish levels due to the high level language items usually being performance issues when used in the core systems. Even with that, the real reason is not just the performance, it is the hiring ability. Sure, I'd love to try D out on a real game engine, problem is, find me a 10+ year veteran of making games with D who can run and direct the project properly. Can't do it, oops. Ok, a C/C++ guy who's come up through the trenches and keeps up on new languages would probably work for the slot but then finding the appropriate additional talent is still a problem, how many folks with core games experience, who know D, could you hire in your area? Saying it is an easy transition is not valid either, some of that talent won't learn the language well, some will, and you'll end up rotating through a lot of folks based on which learn the new language correctly. Remote? Not for a core system until it matures.

My job is to make games, as such the largest talent pool of folks with game experience is C/C++ and that's where I start even if I'd really like to give some of the high level languages a try. Not learning C/C++ is detrimental to folks futures if they follow the above comments. Sure, lots of games have been written in other languages but not generally your top of the line AAA games. C/C++ are still the best supported languages in terms of tools, libraries and ability to hire talent (for games) and it is not going to change anytime soon no matter how much you think another language is superior. Suggesting otherwise can seriously hinder the hire-ability of someone who accepts the above at face value, assuming they want to make a living at making games in the general industry and not small specific indy projects. (That's not a bad thing, but Minecraft is a rare thing.)

I'm not interested in starting a language flame war, I love all the languages in various ways. At work, I use: Assembly/C/C++/C#/Erlang/Lua/Java/Python and others. The core engine is the first three items, the tools are the 4th plus the first three, and all sorts of various bits and pieces covering the other languages. I'm biased, but only to using the proper language for the proper subject matter. So, I'm really really not interested in arguing what language is best unless you take it in the context of what parts of things each language makes the most sense. Please understand, I'm not arguing for the sake of language issues but in that the usual way this comes up is not helpful to newbies without the details included.

This topic is closed to new replies.

Advertisement