Project/Objective that covers a broad subset of Computer Science topics

Started by
5 comments, last by Anfaenger 7 years, 5 months ago

Can you think of a project that would expose someone to a broad subset of Computer Science topics and features? Obviously there is no silver bullet but there are some projects that would expose the developer to a wide variety of CS topics (design patterns, data structures, algorithms, architecture etc.)

Ie, throughout your whole Computer Science bachelor you are working on 1 project. Each course/unit you learn, you apply that knowledge to this one project.

Things I can think of:

  • Develop a simple Operating System
  • Develop a cross-platform cross-application API (by cross-application I mean; desktop application, web application, smart-phone application)
  • Develop a programming language (incl compiler)

I'm thinking one of the above is suitable but maybe you could expand/elaborate that project/objective to ensure that it targets a large subset of CS topics.

Advertisement

Seen as we are on a game dev forum the obvious one would be a game. There's a massive amount of things that go into a game, make it multilayer and you've got networking too. You can probably get away without databases but there are plenty of opportunities to squeeze those in to a game too especially a multilayer game with a persistent back end.

The downside to that would probably be the amount of content that might be required and the non-typical CS type parts of a game such as rendering and physics. These are perhaps parts that could take up a lot of time while not necessarily being things that would be taught.

A vertical slice of a game would be great.

Interested in Fractals? Check out my App, Fractal Scout, free on the Google Play store.

Programming language/compiler is a good subject, albeit not very original for CS study. I've personally written a scripting language compiler that generates fake assembly level binary code to be executed on a virtual machine developed alongside the compiler and would suggest this is an excellent way of demonstrating many core concepts of the more theoretical sides of CS.

One thing to avoid though is the temptation to recreate whatever programming language you are using within the language. It can be very tempting to end up trying to write a C++ compiler in C++ for example. Make some fundamental decision about the language early on that differentiates its from the implementation language you are using. For example, a completely dynamically duck-typed language is a good choice.

In gamedev context, you could make a language for creating game assets; data files with properties for game elements, animation builder that takes a bunch of images to merge into an animation in the game. Higher level considerations are that you generally have a whole lot of sprites or game elements, and you want an efficient notation to deal with them.

Text systems for translations aren't quite trivial as well, if you want to properly handle multiple languages with different cases, gender, and plural forms.

Maps or level descriptions are other things you can see as a language

If we are just looking at data structures and algorithms, then I think the AI field has plenty of exercises.

Building a Distributed Database will cover a massive sequence of topics. Networking, Graph theory, algorithms, data structures, etc.

For me the most challenging and rewarding (in terms of experience) project was development of a 'realistic' voxel engine (basically, trying to replicate Voxel Farm).

First, I've learned about matrix analysis and numerical methods (far from pro, but reading linear algebra textbooks every day), i've learned to love math!

Building a voxel engine involves:

- spatial data structures (octrees for adaptive triangulation-'contouring', BVH (also, K-d and BSP trees) to accelerate raycasting for scan-converting triangle meshes, hierarchical LoD).

- data structures and algorithm analysis (why my new bottom-up linear octree-based out-of-core contouring algorithm is so much slower for chunks > 32^3? because it uses binary search; with the hashtable it becomes much faster)

- multithreading, user-space job scheduling with dependencies (chunk generation/loading/CSG/lighting/contouring should happen in worker threads; Dual Contouring makes it worse, because chunks depend on neighbors).

- data compression is mandatory if voxel size is like 10-15 cm (RLE, dictionary-based, quantization)

- applications of space-filling curves to transform 3D -> 1D (for storing voxel data on disk, to improve data compression, for fast nearest neighbor searches in a linear octree)

- again, lots of math, especially involving matrices, and for debug visualization too.

- code profiling and optimization (e.g. why is my new optimized-for-csg chunk format noticeably slower? because TripleRayRep::IsPointInside() is very slow -> precompute a bit-array with inside/outside statuses of cell coners).

This topic is closed to new replies.

Advertisement