Sign in to follow this  
PropheticEdge

Seeking advice on where to beef up my software engineering skills

Recommended Posts

A bit of background.

Almost a year ago, I graduated from Georgia Tech with a degree in Computational Media. You'll notice that's not computer science. It's actually a hybrid CS/Design degree. The spirit and intent of the program to create people who can code, but also have a grounding in designing "digital media artifacts"; art, UI, usability, aesthetics, and the "meaning" behind things. Many of my friends jokingly referred to the major as "CS For Poets."

"But why oh why didn't you get get a CS degree!?"

Well, I didn't know any better. Back when I was in highschool I'd heard about the degree program (it had juuuuust begun, mine was the first Freshmen class you could declare it as a major). It was described as being a degree highly applicable for video game development by both peers and the counselors at Tech. Since I loved game design and really wanted to learn how to program, it sounded absolutely perfect. I went to school, took classes, dd my work and graduated with a good GPA. Then I discovered that the video game industry wasn't what I'd thought it was, it was a lot harder to get into than I'd anticipated. Not only that, but my education has some pretty serious gaps in it in terms of CS theory and software engineering. That's no good! I think if I can fill those gaps, however, I will become an incredibly strong candidate given the very nifty design portion of the degree.

So what have I been doing this past year? Working as a web developer/iOS developer to pay the bills. I do both for a company that supports healthcare systems, working with databases (t-sql), web stuff (javascript, jscript, XSL, HTML/CSS, ASP classic, ASP.Net), flash development and iPhone apps. I fiddled around with a few game-related projects, but realized toward the end of last year that I was more or less just spinning my wheels and really need to do something else if I want to get job as a software engineer at a game company. Since then, I've been buckling down, reading a bunch of books and attempting to improve my abilities as a programmer, and more seriously pursuing projects.

Thing is, I'd like some advice on which areas would be good to improve upon

What I Know (I'm not claiming world class skill, but these are things I have good working knowledge of. Anything in here is something I commonly use and have implemented working, finished applications with.
[b]Languages:[/b] I can pick up new languages without much trouble, and I've worked with a number of languages that aren't strictly c-like.
[b]Navigating Code Bases:[/b] I'm pretty decent at unraveling a hefty code base, and I've gotten a lot better about navigating large projects written in multiple languages.
[b]CS Fundamentals:[/b] I'd like to think I have a good grasp on the core concepts in CS.
[b]Pointers:[/b] If you hand me the Gordian Knot of pointers, I'll likely choke, but for most reasonable pointer uses I'm fine. I know how pointer math works, I know what a pointer actually is, how to use them to pass by reference versus passing by value, how to make function pointers (in languages that support them), etc. I'm also quite good at manipulating managed languages that work by reference rather than direct pointer into doing my bidding memory-wise.
[b]Simple Data Structures:[/b] If you want me to code simple data structures, I shouldn't have much trouble doing it. Linked lists (of various types), stack, queue, stuff like that.
[b]Templates: [/b]Understand those.
[b]OO: [/b]I've worked a lot with OO languages. I'm well acquainted with common OO paradigm.
[b]Calculus: [/b]A bit shakey on, but I could brush up on it. I took up to calc 2 in college (technically I took calc 3 for CS, but that was really a Lin Al course. I did not take multi-variable calculus).
[b]Linear Algebra:[/b] Decent at doing linear algebra for game programming purposes. Not a master of it.
[b]Best Practices:[/b] I have a surprisingly good head on my shoulders for not doing stupid things in code.
[b]Source Control:[/b] I use source control regularly and understand it decently well.
[b]Debugging and Profiling[/b]: I will not pretend to be a master, but I know how to set breakpoints, step through code, use a call-stack, examine local variables, save output to logs, use a profiler, all that jazz.
[b]Relational Databases: [/b]I work with them every day. I'm not doing anything particularly earth shattering with them, but I certainly do understand them.
[b]Boolean Logic: [/b]I understand it and can work it out on paper if presented with a long chain of logic to follow.
[b]Memory Management:[/b] While this is a rabbit hole in and of itself, it's one that I'm aware of and work around. I'm aware of the expenses involved in dynamic allocation, when to retain and free stuff, where the division between stack and heap are, how to use memory pools and the like. I am not very familiar with smart pointers, though.

What I don't know
[b]Algorithms: [/b]Didn't study them, sadly. I can only implement rudimentary sorts and searches, for instance.
[b]Advanced Data Structures: [/b]Hash tables and trees in particular. This part worries me a lot, since data structures and algorithms allow you to do a lot of very powerful, very fancy stuff with code.
[b]Security: [/b]My knowledge of security is pretty bit tepid. I know enough to not shoot myself in the foot while working with a database of moderate sensitivity, but cryptography is not something I've ever studied.
[b]Operating Systems: [/b]I don't know a lot of what goes on under the hood. I know there's a thread manager, I know it provides an abstract layer between me and hardware, I know it wraps my programs in a protected memory space, but beyond that I don't know a lot about OS design.
[b]Processor Architecture:[/b] Never learned it. One of the early CS courses for CS majors involves creating a processor in a simulator and writing programs for it in assembly and C, but that wasn't in my major path.
[b]Combinatorics[/b]: Didn't study it.
[b]Discrete Math:[/b] Didn't study it.
[b]Multithreading:[/b] Yeah, I've written multi-threaded applications, and I understand how they work, but this is something I'd consider myself novice at.
[b]Best Practices:[/b] Yeah, I listed it down here too. Why? Hubris. I'm sure I do terrible things while coding that I'm not even aware of.

My current career goal would be something along the lines of becoming a "Technical Designer" of sorts (not as a first job, but within the next couple years would be nice). I am not looking to becoming an expert at AI, I am interested in Physics simulations, and I am also fairly interested in Technical Art.

There you have my vague description of things I know, and things I think would be useful but don't know. I know this is really broad, and the questions I'm going to ask aren't going to be easy to answer, but I am having difficulty framing the big picture. Of course, if you need any more info out of me please feel free to ask.

Here are my specific questions.

1) Which areas are most important to improve on for game development? I'm honestly not sure how useful some of the things I don't know are for video game development. I'm sure you could find a use for absolutely everything on that list (maybe MMO developers need cryptographers to secure player data), but I'm trying to get a feel for how frequently used, or of core importance, those topics are.

2) I highly suspect that algorithms and data structures are massively important to learn well, but I am at something of a loss as to which ones to learn and how they apply to games. The only game-specific thing I know about data structures is that binary trees, quad trees, octrees and kd-trees are useful for operations that involve spatial organization and traversal, such as culling, collision detection and depth ordering.

3) Is there anything I haven't listed that you think would be good for me to learn as a software engineer?

4) Are there any books/websites/tutorials you would recommend? Perhaps any websites that offer good coding, math or logic challenges for me to practice on?

Share this post


Link to post
Share on other sites
IMO, algorithm and data structure are the most important things that you should learn.
How to maintain a sorted list (many games may need it)? A linear search/compare maybe fine but if you have knowledge on RB tree or skip list, you can improve the performance quality much.

Math is another topic to learn. You can live without knowing vector (even vector 2D), but the related knowledge may help you to think better. I did line segment collision without using vector, now I knew I could have been more smart if I mastered vector at that time.

NOTE: sorted list and vector are only for example, not covering all you should learn.

Most most important, never stop your step on learning. Learn more after learned a little.

For your question about websites, google is the best website to get knowledge. :-)

Share this post


Link to post
Share on other sites
Seconded - in terms of programming knowledge, knowing your algorithms and data structures is by far the most important thing to learn. It allows you to solve coding problems using the right tools for the job - why use a list, if all you are going to do is lookups etc.? Search and sort algorithms are a starter, but it is worth diving even deeper into the topic and familiarising yourself with typical solutions to common problems in game dev programming.

In terms of Math - boolean logic is a must. That's pretty much the foundation of programming, so it's a necessity. Other math areas - yeah, it doesn't hurt and will actually help you a lot, but you don't need to have a PhD in Maths to be a good software engineer.

But as wqking suggested, the best thing to do is never give up on learning and if you want to become and remain a skilled engineer, keep programming. Not necessarily 16-ton apps, but writing code on regular basis (language doesn't matter, it's just about keeping a certain form...) is required to remain skillful in the area. If you loose the ball for a few months, you might find that you need to put quite a bit of hard work to be as fluent in programming, as you were before. Did that once, never going to happen again. And if you get to regular code writing - be sure to give it a purpose, target a specific problem and try to solve it (anything from implementing an algorithm of your choice to a complex problem, such as writing a game).

Share this post


Link to post
Share on other sites
Thanks for the advice, guys. I do know boolean logic as well, I forgot to mention that; adding it to the list.

Fortunately, I like programming a lot and do it every day. It's my day job and I do it in my off-time too. Unfortunately, I'm doing web development and regular iOS (non-game) apps in which I've never had the need to learn much about data structures or algorithms. I still have learned a lot about other computing topics, but I definitely need to round out my knowledge base a bit. Books on data structures and algorithms have been ordered, and I look forward to reading them! Presently, making a game of sufficient complexity for me without good understanding of data structures and algorithms is a bit like trying to build a house with just a hammer and a hand saw. Sure, I can do it, but it won't be pleasant and it'll be sloooooooow.

Share this post


Link to post
Share on other sites
Data structures, algorithms and a good understanding of [url="http://en.wikipedia.org/wiki/Big_o_notation"]time/space complexity[/url] of algorithms are all pretty important, IMO.

Big-O of algorithms is important to know and understand because without it, you cannot make an informed and accurate decision on which algorithms or data structures are most appropriate for a given task. Knowing a wide range of data structures and algorithms and their properties is important so you can make good design decisions. You won't normally need to know every minute detail of how an algorithm works internally, since you would usually just use a library, but you should have a reasonable idea.

Having some understanding of processor architecture, especially how to write cache-friendly code would be very useful if you intend on writing highly efficient low-level code (eg, if you write high level gameplay code, you would likely not ever think about it, but if you're writing engine code or performance hotspots, it could be important, especially when combined with multithreading). In my personal experience, very few people have a half-decent education in multithreading (which I think is the main reason why multithreading is considered a "problem"), so I wouldn't worry about it too much - but I would definitely advise picking up a good book on the subject and perhaps familiarizing yourself with something like OpenML or Intel Threading Building Blocks.

Finally, if you don't already know a functional language (Standard ML, OCaml, F# and Haskell are all great choices; I would also recommend Clojure, if you can bring yourself to look past the Lisp syntax[1]), I would very highly recommend learning one. A solid understanding of functional programming will make you a better programmer in any language, add a new set of tools to your tool box and help you decompose problems in new and different ways. For example, OO is not ideal to all problems - often a functional approach will be much simpler, easier to maintain and less error prone, especially in a multithreaded program. Even if you will only ever program in C++, its still worth it.

Glad to hear you are brushing up your data structures and algorithms skills.

Setting yourself a largeish and complex project to learn through is a good idea because learning by doing is important and you will likely find that books have pretty contrived examples. You will much better appreciate what you learn when you put it into practice. Of course, you may wish to read through the books first (be sure to do any exercises!) before starting a project, but be sure to keep the books at hand so you can put everything you learnt into practice. Remember that in a real project, you won't want to use everything you know (and rather use the fewest things that get the job done well, and choose the most appropriate solution for the task (not the easiest/hardest/prettiest)). I don't think its terribly important if you do this for your first project or not, but be aware that you will probably throw the code out when you're done (but do finish it either way, if you can!) - thats part of the learning experience. Project 2 will be infinitely better.

Good luck!



[1] Actually, I would recommend Clojure for more reasons than just because its functional-by-default. Clojure has a great time-management/concurrency story, is immutable by default and has some great abstractions (eg, most things can be treated as sequences in a very convenient and natural way).

Share this post


Link to post
Share on other sites
Hmmmmm, that's a pretty good idea! Last time I tried functional programming was with Lisp, and it had me running for the hills screaming within two weeks or so. That was several years ago, so I think taking another stab at it (and NOT using Lisp) would be something I could do. I'll check out Clojure.

Share this post


Link to post
Share on other sites
[quote name='PropheticEdge' timestamp='1303151329' post='4800008']
Hmmmmm, that's a pretty good idea! Last time I tried functional programming was with Lisp, and it had me running for the hills screaming within two weeks or so. That was several years ago, so I think taking another stab at it (and NOT using Lisp) would be something I could do. I'll check out Clojure.
[/quote]
Note that Clojure is based on Lisp, so if you prefer to avoid all Lisp variants, you might be better off with Haskell, or an ML (eg, OCaml or F#).

Share this post


Link to post
Share on other sites
[quote name='dublindan' timestamp='1303153433' post='4800017']
[quote name='PropheticEdge' timestamp='1303151329' post='4800008']
Hmmmmm, that's a pretty good idea! Last time I tried functional programming was with Lisp, and it had me running for the hills screaming within two weeks or so. That was several years ago, so I think taking another stab at it (and NOT using Lisp) would be something I could do. I'll check out Clojure.
[/quote]
Note that Clojure is based on Lisp, so if you prefer to avoid all Lisp variants, you might be better off with Haskell, or an ML (eg, OCaml or F#).
[/quote]

The thing that bothers me the most about Lisp is the syntax. I'm still willing to take a stab at Clojure. I have a friend with similar programming taste who really loves Haskell, so it'll probably be my fallback.

Share this post


Link to post
Share on other sites
[quote name='PropheticEdge' timestamp='1303155421' post='4800034']
The thing that bothers me the most about Lisp is the syntax. I'm still willing to take a stab at Clojure. I have a friend with similar programming taste who really loves Haskell, so it'll probably be my fallback.
[/quote]
Most people overlook Lisp because of the syntax, but really its a bad reason to avoid it as the syntax will fade away into the background very quickly. Actually, most people, when they get over the syntax, start to like it - it is extremely regular and consistent. The thing is, you do need to ignore it for a while. Note that an editor with rainbow parentheses will make dealing with the parentheses infinitely easier.

Personally, I think it's worthwhile, especially Clojure. The whole Lisp "thing" about code and data being one (and macros tie in closely with this) is a very powerful feature.

Having said that, I think learning to think in a functional way is more important to you right now. Clojure will help you there because its pure functional by default (with all variables being immutable by default) and it also has a very powerful sequence abstraction which, IMHO, fits a lot of programming problems much more naturally than OO. But, Haskell will work just as well for this, so if you end up not liking Clojure, its a good choice too.


If you're looking for books, I learned Clojure from Stuart Halloways book Programming Clojure. Its an excellent book - clear and to the point - but I think its a little out of date now (at least two Clojure releases (with significant new features) have happened since, though the book is still good to get you to the point where the new features are useful). Chris Houser and Michael Fogus' book The [url="http://joyofclojure.com/"]Joy of Clojure[/url] is up to date, and also extremely good, though a lot less "learn clojure" and a lot more in-depth than Programming Clojure is. Unfortunately I can't recommend any tutorials because I did not use any when I was learning (using Programming Clojure instead).

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

Sign in to follow this