Kek or how I’ll waste my free time going forward

Screen Shot 2016-06-30 at 20.52.45-hLBpw5hl7K

It’s been a while since this blog had anything other to offer than “libGDX x.x.x released”. This was partly a result of my engagement with RoboVM, which, as you may have heard, is no more. And while I got plenty of real-world-ish stuff to do going forward, I also feel in need of something to challenge my old-farty brain a little in my spare time. For bonus points, I’d like to share my insights and failures with you. And maybe, and that’s a big maybe, something useful comes out at the other end.

You may be thinking: “But what about libGDX?”. Truth of the matter is, I have not been actively pushing code to libGDX in a very long time, save for some minor coding like the initial LWJGL3 backend, or helping out with the recent iOS backend shenanigans. My day to day (or better week to week) libGDX activities have mostly been limited to staying in contact with our fabulous core team, doing the occasional release, managing a libGDX game jam, or kicking our Mac build slave in the butt. My role has simply changed over the years. I’d like to focus my free coding time on something new. Fear not, I will continue to play the benevolent dictator and keep things going as before.

With all that out of the way, let me throw a bunch of thoughts at you. Using my usual wordy style of writing. Enjoy!

The computer science education gap

Disclaimer:I may use the terms “computer science”, “computing” and “programming” interchangeably. I’m aware of the differences, cut me some slack.

I’ve always enjoyed teaching. Let me rephrase that. I’ve always enjoyed telling people of my failures and successes, in the hopes that they can take something away from them. Past endeavours included writing a 700+ pages book, doing a ton of conference talks and workshops, lecturing at university, educating decision makers at companies, or simply talking about my day-to-day technical work with my non-technical SO.

I have also witnessed how kids are taught “computer science” and “programming” at school. It’s a small sample, but it’s generally not pretty. Kids are “fortunate” to come out of school with basic MS Office knowledge. Programming or basic computing, if taught at all, are mostly limited to Scratch like systems. There’s nothing intrinsically wrong with Scratch-like systems. A big number of scientific studies show that initial acquisition of basic computing concepts appears to be better served by exposing the learner to a visual programming environment. Go hit Google scholar, follow the citation graph of “Scratch: programming for all”. Fun fact: developing games has been identified as the best motivator across age groups and genders by multiple studies (and I conveniently lost the citations…).

However, some studies also indicate that kids themselves don’t feel like what they are doing is “real” programming when using Scratch-like systems. Without them being able to describe what “real” programming entails. It’s akin to giving a kid Duplo when what they really want is Lego Technic. Some manage to stay motivated and eventually make the jump to “real” programming. (Note: I view visual programming systems as “real” programming, albeit limited). Most stop engaging with computing in any shape or form.

And that is fine. While I do appreciate the recent push across the industrialised world for more early-age computer science education, I also recognise that computing does not have to and will not be for everyone. Still, nothing would warm my heart more if we can get more kids (and adults) to leave their walled-garden content consumption machines and join the community of digital makers. The earlier we can plant that seed, the better. But something is lacking.

10520_1-lego

51wkYbxWbIL

I believe there is a missing link between the visual programming systems ala Scratch and the text-based behemoths that make up modern day programming. The gap between Scratch and JavaScript/Python/Go/Rust/C/C++/Lua/C#/F#/Clojure/Java/Kotlin/Scala is huge. Not only is there a switch in input modality that comes with pesky de-motivators like syntax errors, slow typing speed, or concepts that need to be hand-waved away initially (everything is a class, et. al.). The overwhelming complexity of just getting set up and understanding the basic operation of these development environments is to much for many aspiring coding apprentices. On the other end of the spectrum, Scratch-likes are so far removed from real-world systems that the knowledge gained is often insufficient for further study.

On top of these “technical” issues, the social aspects of the communities around Scratch-like systems get lost as well. Trying to enter the circles of “real” programmers can be a rather frustrating experience. While there are exceptions to the rule, most communities I’ve been part of have been downright hostile to newcomers. Furthermore, where would you point a newbie interested in joining a community for “real” development platforms? Most communities are heavily fragmented, and it’s entirely unclear which of these sub communities are most suited for beginners. For something like Scratch, it’s very clear: simply go to the Scratch website and find like-minded people and mentors (and moderators).

And while technically possible, sharing and remixing your and other people’s work is multiple orders of magnitude more complex using “real-world” systems than using projects like Scratch. I view this feature of most educational programming environments to be key in keeping newcomers motivated, offering additional sources for self-driven learning, enabling collaboration, and learning soft and organizational skills.

“But Mario you silly goose, there are a metric ton of such systems out there!”. Yes, there’s a ton of educational programming environments out there. Over the past few weeks, I got to enjoy many of them, including, but not limited to Tynker, Stencyl, Scirra, Snap!, CodeCombat, or MinecraftEdu. The last one is now actually called “Minecraft for Education” after the buy-out of MinecraftEdu by Microsoft. Leaving hundreds of teachers stranded without a backup plan.

Some of them are infuriatingly bad (no undo, slowness, glitches and bug galore) that I’d not recommend them to my worst enemy. Some have a weird understanding of pedagogy. Tynker for example has lessons specifically targeted at girls, including licensed assets from the Monster High brand. Interestingly enough, the lessons for girls on mobile devices are a LOT simpler than those targeted at boys. Because we all know, girls are stupid, right? Many are behind pay-walls or limited to a single platform and device class. (Looking at you, Swift Playgrounds. So close, but no cookie.)

The other solutions in that space are great to introduce extremely basic computing concepts to your kid (or adults), but are a long way from narrowing the gap to “real” development environments.

Project Kek

cute-unicorn-clipart-unicorn4

In short, I want to try creating that kind of missing link vaguely described above. Here’s what I believe are crucial features:

  • Free, open source (I hate money) and as cross-platform as possible
  • A programming language that scales with the user’s experience (imperative, structured, functional, object-oriented), with a low barrier of entry, and a high ceiling of what’s possible
  • A set of standard libraries tailored for each experience level, geared towards game development
  • A self-contained, extendable development environment that iteratively introduces concepts like code structuring, debugging, deployment & packaging, version control, dependency management, etc. and allows collaborative work out of the box
  • Newcomer friendly, localized documentation for all of the above, geared towards self-learning
  • A moderated community hub to share, remix and talk about your creations
  • A way to let educators create and share teaching materials

Yes, this sounds a bit insane. But consider that these features can be scoped. Take a look at Pico-8. It already does a lot of things right in my book. There’s nothing prohibiting the first few iterations to work on a similar complexity level as Pico-8.

I think of it as the training wheels version of a real-world programming environment. Another analogy would be a modernised version of the environments of old like QBasic, Turbo Pascal and so forth. These systems from the pre-internet age came equipped with enough material to let motivated people become self-starters. My hypothesis is that an internet-age version of such a tool might just be the right thing to fill the gap between Scratch-likes and “real” programming environments.

Next Steps

As a first step, I want to protoype the first few features from the list above. This includes the first iteration of the programming language, a minimal standard library, and potentially piggybacking on an existing editor like Visual Studio Code. All of this will be documented on this very blog.

Should the initial prototype be a complete disaster, I’ll try to recycle as much as possible and potentially head off into an entirely different direction. An agent-based, programmable, shared virtual environment could also be an interesting avenue to tackle this problem. From a technical side, this is quite a bit more advanced and resource intensive, which is why I want to hold off on spouting the finer details just yet.

All things considered, I’ll likely fail. But I’ll have a metric ton of fun doing so!

Categorized in: kek

35 thoughts on “Kek or how I’ll waste my free time going forward

  1. Hey Mario, sounds really awesome, good to see you’ve found something new to keep you busy 😉 Looking forward to reading about your progress.

  2. I think it’s a great idea. I mean, I could install QBasic on my PC to teach my son programming, but there would be this massive disconnect with the real world. He wouldn’t be able to distribute his “creations” in any meaningful way. Long story short, there is a HUGE need for what you describe. I’m in completely agreement about silly “everyone needs to be a programmer” solutions like Scratch. Not everyone has the talent or interest in coding; that’s just reality.

  3. Interesting idea! Wouldn’t creating a new language for this introduce the same problem as with existing solutions – making the gap between the learning environment and the real world too big? No one’s going to use a “learning language” in the real world and people who learn your language will need to carry over concepts to another real world language, which would not be easy. Why not instead focus on creating learner oriented tooling/training wheels around “real” languages like Java or C#. Both languages are extensively used in game development, and would probably be easy to pick up if there is good educational tooling around them.

  4. That is a valid thought. However, I think I’ve outlined above why using an existing platform may not be in the interest of the learner. Setup is terrible, communities are fragmented, many features required for the simplest of apps need to be explained away and so forth. Finally, it’s fun to write your own language 🙂

  5. Hi Mario, I have fond memories of learning how to program, first as a child with Logo, and then later as a young adolescent with Quick Basic. I had no idea what the landscape for that was like today, so it’s interesting to see just how abstract and visual things have become!

    I hear you when you talk about how kids recognize that it’s not “real”. I think there is a large gap in education between beginning to learn how to program and actually being able to do it for “real”, and while the visual environments look like a lot of fun, they may be too far removed from reality. Not everyone has the aptitude or desire to program, which is OK, just like not everyone has the aptitude for writing, drawing, carpentry, and so on (including yours truly), but for those that have a real interest, ramping them up to the “real” stuff while their brains are still young and full of energy might be the best way to go about it!

    Even for those of us who studied computer science at the university level, there’s a huge gap between knowing enough to ace tests in school and actually being able to survive on a job. My first dev internship didn’t go well for me and I nearly quit the field out of frustration, simply because I felt like such an idiot and nobody had the time to mentor me. I’m very happy I later found a good mentor and stuck through it, but I imagine I’m not alone in this experience.

    As time goes by, I realize that I learn and retain more when I can connect everything in my head and understand how it’s all relevant and makes sense. I think many schools currently do this backwards, because they start with the high-level stuff and go down to the low-level stuff. However, a lot of the high-level stuff is very hard to understand when you’re first exposed to it; things like design patterns, object-oriented programming, references vs values and so on are very hard to grasp when you don’t already have a scaffolding of knowledge in your head built up through sweat and tears, a scaffolding many of us now take for granted. Formal education can also be very one-track minded, emphasizing OOP at the expense of all else, for example.

    Some people believe that if you don’t get pointers vs values early on (for example), you just don’t have what it takes and should give up and change career paths. I don’t believe that, because I believe that if you go from the other direction, from the low-level dumb machine that just executes stuff in sequence, up to the high-level stuff, then there’s a solid tree of knowledge upon which you can build upon. The high-level stuff becomes MUCH easier to get a handle on when you have some idea of what it’s all built on.

    So all this is to say, good luck with the project! It sounds like something I would have loved to play with back in my early years and maybe even today! 🙂

  6. You amaze me every time, Mario! 🙂 One thing I can suggest: have you had a look at processing? You code in basically java, it’s IDE and compiler in one package and it focusses on visuals. I always felt like visual programming is a really good entry point into programming. Not getting visual feedback is what I feel scares many people. Getting hello world onto the screen is boring compared to moving a box around the screen with your code! 🙂

  7. I have quite some experience with Processing and ProcessingJS actually. I think they do a few things right, and a few things totally wrong. Some of the Processing API just makes zero sense, interchanging nouns with verbs etc. I aim at providing a system that enables doing something like Processing along all sorts of other things.

  8. This reflects pretty much my history as well. I found QBasic to actually be a motivator to learn more lower level concepts, as it was so limited in what it can do. The challenge for Kek will be to find a system that scales with the experience of the user, from LOGO style turtle movement to entity component systems and reactive programming. Yeah, it’s doomed already 🙂

  9. I was almost certain you already knew about it and considered it… just wanted to make sure 🙂 I’m certainly intrigued what you come up with. Sounds ambitious!

    To restate: what I liked most about processing was its little amount of boilerplate (that you had to handwavingly accept) to get something running and on the screen. Can’t get much shorter than ellipse(50, 50, 80, 80);

  10. Awesome idea. I’ve been teach programming camps for elementary, middle, and high school students of the past 5 years. We use Scratch, Alice, and Visual Studio respectively. The gap from Scratch to “traditional” programming is huge, and anyway to solve that would be an amazing feat. I’d back this 100%!

  11. Drop me a mail at badlogicgames at gmail dot com. I’d love to hear what you think were the biggest gaps hurdles!

  12. I still have fond memories of forcing myself at 13 to absorb K&R which led to lots of dabbling w/ Fastgraph back in the day before web 1.0 / perl / Java et al. For my luck I got an initial unpaid internship then min wage at a perl shop summer before college and was instructed to look at Java / create a chat app and report back; the rest is history.. 😉

    I think whatever route you go down whether it is visual or a new programming language is that there is a feature to covert ones effort to a standard programming language that is organized well w/ comments explaining the translation as necessary generating a complete project structure that can be opened up in a standard IDE then compiled instantly there to run. Extra credit to support multiple language / IDE targets as applicable.

    Go for it Mario!

  13. Can’t argue with that last point! 🙂 You could however solve the other 3 problems by providing a easy-to-use IDE, a community site (which revolves around your IDE/Ecosystem than the language itself) and a mechanism which abstracts features. As the learner progresses, you could remove some of the abstraction. TouchDevelop (https://www.touchdevelop.com/app/) has done something like that – it has skill level settings of Beginner, Coder and Expert. The beginner level features a block drag-drop interface and exposes only a limited subset of the language. Coder and Expert progressively expose more language features. However they too have gone with their own JS-like scripting language instead of using plain Javascript or Typescript.

  14. Hey Mario, using this subject, what do you think was the more effective way of studying/learning programming?

  15. The .NET platform is still a mess all around. Everyone is welcome to knock themselves out.

  16. Care to elaborate? As someone who’s sat in his Java ‘ivory tower’ for most of his programming years, I’ve always heard how .NET is a much better platform (at least for Windows development). Personally I’ve never been wooed during my brief time Visual Studio which everyone seems to be raving about, and I’ve found tedious to get everything set up for the luxury of WP development (10s of GBs of install files), but that’s just scratching the surface.

  17. Actually, with QBasic you can distribute the code to MacOS, Windows, Linux and Android. Have a look at http://www.qb64.net/ . From my experience, it is faster to do the initial development using the old QBasic interpreter in DosBox and later compile the code using something like QB64.

  18. No cross-platform IDEs except Project Rider, which is a great start, but still a tad to buggy for productive use. MonoDevelop/Xamarin are improving but nowhere near as good as VS or what you are used from the Java ecosystem . CoreCLR 1.0 has just beem released. I invite everyone to try it out and see it crash and burn. It’s a great effort, and I applaud MS for seeing the light, but it’s to early for anything close to production use. The whole set of CLI tools also seems to be in flux (project.json anyone?) and IDEs are lagging behind. Creating cross-platform libs that work on .NET/CoreCLR/Mono is possible, but nowhere near as simple as in Java land. The .csproj format (orignally to be replaced by project.json, now making a comeback) is super bad. OSS in .NET land lags behind all other ecosystems. I could go on. I’m a fan of C#/F#, I don’t think the ecosystem they are embedded in is any good.

  19. Hi Mario,

    I am not 100% sure will this help or how much but here’s example of my 12 year old son. He started with Scratch and relatively quickly got to point where he was quite comfortable doing simple games with it (pong alike and more). From there I took him to a Games Creation Computer club in school (where I joined as an help) and for a year there using only Python (without classes) and Pygame he managed to get to same level as with Scratch and then much more. From there, he was introduced to Java coding with his interest in Minecraft and now he can do some (serverside) plugins, too (raining squids, jetpack and such). Aside of being led through initial examples, most of his programming was with very little help of me/google giving him chance to learn on his own. And as last thing he is now making tiled based platformer using LibGDX – pretty much on his own!

    So, as one of inspiration for your new project you can look at Python + Pygame as it almost tick most of the boxes you are after. We mostly taught kids simple Python where main game was in one ‘while True:’ loop plus a few methods doing important stuff (BTW you can see games interpreted by my take on Python in Java, compiled to GWT with LibGDX providing backend for Pygame graphics here: http://raspberrypilot.com/index.php/games?start=10).

    Another approach might be what some Spanish Arduino alike web site (bq.com) or BBC Microbit does – giving you both visual Scratch alike programming and real code behind it (C and JavaScript respectively). If it can be, then applied/deployed to different platforms – even better! If programming language is Python(*) for instance, I can already see my interpreter + LibGDX I did as above, could be used online for immediate WebGL result, but produce .apk and (uber, executable) jars to be downloaded. So you can get all combined – graphics programming, backed with ‘real’ language and result used as ‘real’ app at the end!
    (*) I am not pushing Python as an language – it just happened to be our choice of language to teach kids basics of programming (if/while/assign/vars/arrays and such)

    Actually I can now clearly see relatively big, online platform that is language agnostic and can be expanded to quite a good learning tool from early ages to (semi-?) professional game makers but it would take this already post to even longer and even less readable (my apologies for the size of it).

  20. Hey, that sounds great! Thanks for sharing your experience. You said it took about a year for your kid to get to the same productivity level as with Scratch. What would you say was the biggest hinderance?

  21. Frankly? Fear of new stuff! And his age (he was 11 at the time) And the worst is that there is no solid line, point in time you can say that’s it – but gradual acceptance of new and ‘scary’ until he would pick rather Python and do something for himself then Scratch.

  22. I am interested in following your progress here, you’re doing great things. However I am also interested in LIBGDX updates. Is there another stream I can go to read about what the core team is doing to improve LIBGDX since you’re going to be focusing efforts elsewhere?

  23. I think one of the problems with kids learning today is no matter what language or tools they pick there are so many barriers to entry before they can actually code anything. First you have to download something, then you have to install it, then probably install a bunch of extra bits, then configure this and that and so on.

    It is so far removed from the 80s where I could just switch on my 8-bit computer and immediately be faced with a prompt where I could start coding. I’ve seen various projects that try to simplify the coding process for kids but nothing I have seen comes close to that experience I had as a kid. Because you just switched the machine on and started coding it also felt like you were much closer to the “metal” – even if you were using BASIC.

    Projects like the Raspberry Pi try to help but even that fails because you still have to set up loads of stuff before you get going. Whilst some kids may like that tinkering around I think for most kids it is a barrier.

    So, If you could design something that required no installation and offered instant coding and instant results I think kids would be far more tempted to try coding. I guess these days the only zero installation option is a web based tool.

  24. Hi Mario, I found your article very inspirational and exciting. I love the idea of a complexity scaling bridge into technology for both young and older learners. It occurs to me that the friendly visual element so successful in scratch might be “layered on” much like a visual round-trip engineering tool (remember those?) such that it becomes an optional programming paradigm. The learner can see the “real” code produced by the visual environment and conversely can generate visual representations of someone else’s “real” code.. A challenging and exciting task to say the least. I look forward to hearing more 😀

  25. Hi Mario,
    Great idea and great challenge. I’m a teacher and am looking for THE environment to introduce students with basic programing (I had a 4x45min window). Never mind, this year I reused libgdx to create a game but I left the boat for UE4, at first just for the fun of it. UE4 on its whole is out of reach for casual beginners but it offers scalability in many ways as the code is available and it might be possible to redefine the dev environment, but not only… Although I don’t have the time to follow this road now, I think that in the perspective of introducing coding, UE4 might be great as it offers the teachers the ability to define custom 3d environments and an easy way to specify tailored functions/macros to fulfill specific goals. Moreover, in tailored settings, students will always be able to leave the path and explore what is beyond in terms of settings modification and dev. Might be good for inspiration sake too to have look at the blueprints’ philosophy.

  26. Sounds interesting. Have you heard of AMOS? It was a great entry-level language combined with an IDE dedicated to creating games on Amiga. It was slow but powerful. I’ve made my first games in it – on Amiga 500. Might be a bit of inspiration for Kek. It probably had the first IDE to offer the ability to collapse blocks to help visibility.

  27. PS. I mentioned AMOS because it was great for beginners. To play music you just had to type “play music NAMEOFTHEFILE”, it had an animation system that worked a bit like Scene2D actions (but was done by a string based sublanguage), it was a type of BASIC but closer to Pascal I think thanks to functions and procedures. For kids it was simple enough to understand, for adults it offered complex enough features so you were able to create whole games in it (there was an example platformer made in it and there were some commercial games made in AMOS too). It even allowed access to complex Amiga GPU features like copper: https://en.wikipedia.org/wiki/Original_Chip_Set#Copper

  28. Yeah, I’ve been struggling to find a good language which would allow kids on iOS and Android to learn and contribute to a project.

    Android has a few javascript IDE’s, and you can even run a node.js server on them (so can transpile from better languages to javascript). But pretty much nothing for iOS…

  29. I just noticed that Apress is going to release the 3rd edition of Beginning Android Games, are you involved in this new edition ? Or is it just a coincidence that a new edition is released at the same time that you seem to be interested in the education part ? 🙂

Leave a Reply

Your email address will not be published.