I just want to have some fun writing something without headaches, and that is seemingly less and less easy to achieve today. I'm not a fan of the complexity of either JavaScript or C++, and while I very much like Swift and working in the UIKit world, it's not so portable to platforms that many use.
I feel like there aren't really any good options in software development any more. It's always one big compromise with lots of possible decision fatigue. Every direction has drawbacks.
If I could write an app in a good static-compiled language that did not require extraneous expertise in CSS but that shipped on a web page and looked good using tools only in that language, with good interop with an HTML Canvas, that would be one possibility, but it is again a compromise -- no easy multithreading, dealing with all the front-end baggage to bundle or deploy such an app, etc.
Any recommendations? I'm not afraid of learning an entirely new language too.
I've had a long time dream of getting a broken jukebox and gutting it for a Raspberry Pi, but keeping the external interface in tact. I know next to nothing about hardware engineering, and can't write more than ten lines of Python without needing to Google something, but I finally got a broken juke in need of fixing, a multimeter, and a hard drive full of music ready to go. The fun isn't the Python or learning GPIO, it's that eventually I will have a cool retro jukebox with hardware and software I wrote in my basement.
(1) Unlearn the "large team workflow mindset" and embrace the "single developer mindset" again. You don't need a plan, a Kanban board or a bug database, just an idea in your head. Get rid of "big languages" which are good for team work, but just a hinderance when working alone. In my case this meant: dropping C++ and embracing C (today that would be: Zig). Focus on getting shit done like when you started out with programming instead of agonising over design decisions. It's better to throw away something that doesn't work than wasting too much time upfront with planning (and then it still won't work). At least you still learned something valuable. Try to do the 'planning' part passively in the back of your head out in nature while taking a walk or some other outdoor activity.
(2) Pick a challenging problem where you have no idea yet how it works, but which you would like to know. In my case this was "home computer emulators".
...well 3 steps, step 3 would be: don't set yourself any deadlines for this sort of "fun stuff".
1) To have fun 2) To write a cross-platform web-base app with good HTML canvas inter-op ...
If you really want to deliver this cross-platform app, then it seems that's going to be more work than fun, although no doubt good tool/framework choice can help minimize the headaches.
For a fun project it seems better to avoid all of the things that you already know are going to make it not fun!
My current fun project is writing a compiler to run on an old 8-bit system (initially targeting en emulator) ... 99% useless, but fun, and I get to choose whether to implement the bits that are stupidity on behalf of the language spec, or extend the language to make it better, etc, etc - no practical considerations forcing requirements on me, since it is purely for fun.
Your title says you just want to have fun programming but your post is full of other requirements. You need to decide if having fun really is what you’re after—in which case it seems you’ve found your answer—or if it’s secondary to some other metric such as customer reach.
There is always a compromise. No solution is all good things at once, including easy, performant, and cross-platform. If that existed we’d all be on it. You’re clamouring for a past which I’m doubtful truly existed.
Pick up an Arduino and there’s no one right answer. It’s still very hobby oriented, so a lot of people do fun an wacky things. The learning curve is fairly short. What I call the ‘book count,’ or how many books you need to read to be productive, is pretty low. On the other end of embedded, it gets very formal, very quick, but that’s for professional embedded developers.
Or, pick a ‘dead’ language. Go to some vendor like thrift books, or hunt used book stores, for books on that language. You might find some for $5. There’s no pressure, and you have full agency to make the greatest or the worst decisions you want. And a lot of the communities around these ‘dead’ languages are a lot of fun.
- Forget about the JavaScript ecosystem, don't even touch it, it's a monster
- Use htmx on the front-end (https://htmx.org/)
- Use plain-old CSS with minimum dependencies (sanitize.css)
- Use lightweight CSS framework if you need one (bulma or purecss)
- Use Go on the backend (all other modern languages are bloated)
- Use AWS Lambda
- Use DynamoDB if you don't need data processing
- Use Postgres if you hate or don't want to learn DynamoDB
- Compile SQL to type-safe code (https://sqlc.dev/)
Instead I realized quickly that what drove me to quit had been the fact that the joy of coding had left me. And so for the last two months I have been working towards regaining it.
And at this point I realize I have gained it back.
The only projects I have been working on are small libraries and apps whose ideas had written down over the years but never touched.
The longest project has been 3 weeks. Others, like the library I worked on today, have only taken a couple of days. Also done some open source contributions here and there.
I would now recommend it to anyone, given if their financial situation allows for it, to step off the hamster wheel on occasion and work on the things that really motivate them.
When I re-enter the job market, it will be with renewed vigor and plenty of new know-how.
"But it's hard!" That's the point: surmounting the challenge is where the fun comes from. And then you have skills that 90% of devs don't even attempt because they believed it was "hard."
I started https://wordsandbuttons.online/ looking for something fun and meaningful to do. I wanted to practice interactive writing and wanted to involve the bare minimum of technology to go forward. So I use rudimentary HTML for layout, JavaScript for interactive illustrations and UI elements, and Python for massive code changes. I have a bit of CSS, but I don't use "cascading" feature of it so whenever I want to change a style overall, I write a Python script for that. On the plus side, every page is entirely self-contained, and my CSS is outrageously simple.
There are no dependencies not external no internal, so the workflow is entirely stress free. Well, rather stress isolated. If I break anything, I know that the breaking change is exactly in the thing I am currently working on and not anywhere else.
If you don't care about productivity and want to enjoy programming with as little tools and dependencies as possible, vanilla JavaScript is the way to go.
I've been making games with varying degrees of seriousness. I even released a full solo game last year, which was a wild ride. I'm lucky enough to have a job I'm satisfied with, but even so, creating games has never failed to introduce super interesting challenges, it's just a great creative outlet for code and art alike.
I think Godot (Python-like with C# support) is in a very interesting place right now, and it's easy to get into and start making some prototypes. If you want something more involved, try Monogame (C#). There are always Unreal (C++) and Unity (which IMO is getting harder and harder to recommend due to their business model and decisions as of late).
Plus, game developers have some of the best online communities on virtually any platform you can think of. You can always find someone to consult or even join a project, from modding to rev-share game development.
In terms of CSS; you'll need some form of styling in whatever language, there are plenty of abstractions on top of CSS if you want [something not css].
I would suggest having a look at Next.js if a web app would work, React Native (use Expo) if you want mobile, or Tauri if you want to focus on desktop (Electron, but in Rust, more performant, smaller size, more secure).
Another thing worth checking out is Flutter. I'm personally not a huge fan for irrelevant reasons but it is cross platform, and it's compiled not-JS (Dart).
I also want to say FE has come a long way, the web platform is much more stable, there are great frameworks and libraries, the tooling is amazing, and above all it's really fun and productive. Give it a shot, you might enjoy it. (Do use TS, or Rescript, or something, JS is better with types).
Static FP lang targeting the web as a runtime environment. Wonderful people. The nicest compiler in the game. Tight dev loop. Good tooling.
No JavaScript knowledge required. Join us.
Now I don't mean to imply there are not good uses for tool chains like C++'s etc. Only I will say that the disconnection from the end result caused by the long write-debug-ship cycle leads to a certain programmer malaise. The same is true for things like coding chips with Verilog. The production chain is so long with respect to the creative endeavor itself that motivation and satisfaction is hard to get.
So, for me, doing SaaS software, which ships "all the time" with Clojure, has restored my ability to 1) read the std library and most others easily to understand them, 2) Create control, preprocessing and IO primitives myself for special purposes which easily rival standard ones, 3) use interop to access large libraries written in another long lived language (Java), 4) build and use tools that simply introspect the code, producing my own tool additions and automations without AST's, and elaborate tooling, after all, code is just data.
Obviously YMMV. One blog post documented someone who changed from C++ to Clojure and did not find satisfaction. But he was attempting to do something, embedded I believe, that is not well suited to a JVM. So changing to Clojure does involve changing to an area that favors one of the two big Clojure host language machines, JVM or Javascript based environments.
- You write everything in Rust. Dioxus runs by patching the output from your Rust code onto a VirtualDom in a Webview. So your code runs native, the WebView is just one big canvas that you use to display your UI. It's using WebKit/Tauri not Chromium, so apps are much smaller.
- It is super cross platform (macOS, Windows, Linux, Terminal, Wasm & (very unfinished) iOS/Android)
- You still need to understand some CSS but you could also use an existing framework like tailwind.
- BUT: The way Dioxus is structured, you don't have to Render to a WebView. You can plug in a custom renderer which gets told which elements should be placed in the UI with which parameters. That makes it easy to write a native AppKit or GTK renderer which just places widgets and uses a Flexbox system to figure out the sizing.
Most importantly, working with it is kinda fun. It also supports hot code reloading and so on.
Check out the talks by Rich Hickey to see if you have the same sentiment or perhaps this paper: https://download.clojure.org/papers/clojure-hopl-iv-final.pd...
The community of the language largely follows this philosophy, the ecosystem is very stable and there is little churn. The most common implementation is on the JVM making the language very portable.
The headaches historically were with getting your environment setup, but there are amazing tutorials and good tooling or VSCode, IDEA, Emacs and vim.
As for "fun" for UI, I found doing UI in Dear ImGui strangely liberating. It sounds like a web front end is part of your requirements, maybe, but if not, try one of the "immediate mode" UI toolkits like that. They have their limitations, for sure, but they come with a lot less "normative lifestyle assumptions" and it's strangely enjoyable to toss a UI together in them.
Also I started having a lot more "fun" once I start doing my hobby projects in Rust rather than C++... once I got past the initial learning curve... I say this not so much for the language side of things -- which can be a little straightjackety -- but for the fact that I was no longer fighting all the sharp corners in the C++ ecosystem (CMake, different 3rd party lib packaging styles, dubious 3rd party library programming styles/standards, etc.). Rust+Cargo simplifies a lot. And the third party crates are generally of pretty good quality and consistency.
Or learn another language, like Zig. That looks fun, too.
HTML template: https://github.com/juancarlospaco/nim-html-dsl
SDL on emscripten: https://jipok.github.io/Nim-SDL2-and-Emscripten/
Here's my own fun embedded programming project... it's been 5 years now, so I should really do something like this again:
https://foundrytechnologies.com/relay.php
It didn't too well commercially, perhaps because the 3d-printed case I designed for it in looked a bit cheap. But the embedded coding was very fun, as well as putting all the pieces together (embedded coding, website & web app, PCB design, CAD and 3d-printing were all involved).
I did sell a few units, and shipped them worldwide. I still see them checking in with the server for updates every 5 minutes from around the world, and there's about half a dozen working around my house today, including one outside by the front door bell. That one's been exposed to the Texas elements for 5 years now and hasn't missed a beat, except that it needed a new case last year to keep it looking fresh.
There's more than one way to skin a cat, and for a project with even minimal complexity there are going to be tons of perfectly legitimate choices for how to bring it to fruition. In theory this is great, it's so easy to find a tool that works for you, but it's also very easy to get into analysis paralysis. If that's something that really bogs you down and makes the experience unpleasant, then you need a way of easily reducing the number of options. If you set out from the beginning to make a challenge out of it and add some stupid requirement that you have to satisfy, that can do the trick. You're no longer looking for the optimal choice, just an acceptable option.
There are other benefits: a handicap makes doing boring routine things stimulating and forces you to think about problems in new ways. If you choose a handicap that forces you to use something you don't have a lot of experience in, then it's a great way to learn. You tend to develop a deeper understanding of the fundamental principles underlying what you're trying to do. You can also be a bit easier on yourself about the quality of the end product since hey, it's pretty amazing that you could get it to work at all.
The goal is too big and you are but one person with a day-job.
Don't quit your day job.
If you want to finish a project and have fun: Do not attempt to solve world hunger or censorship or any big problem, because you will find it is big and thorny.
Do: make a list of tiny projects. Extra tiny. Make sure they are fun, e.g. asteroids or Snake or displays-a-random-emoji or something silly.
Make a list of non-goals for your project: e.g. it will not be cross-compatible, it will not be multi-threaded, it will not support multiple users, it will not be scalable, it will not support multiple resolutions, etc. Try to make it so dang simple you think you can knock it out in 2 days. (It might still take a month)
If you need a framework or library, pick one and only one library. (write the rest yourself) Pick the smallest one you can find that covers the part of the project you don't wanna do, whether that's game physics calculations or databases or whatever.
And then write your project, preferably all in one big ugly file that does not meet anyone's definition of organization or documentation or quality.
That's when it's fun, when the scope is small and understandable, and there is no expectation of having to fix anyone else's bug reports but your own.
(To be clear, these rules are only for personal projects, I do not recommend this level of anarchy on a team or a "real project", just a project where the goal is to have fun.)
I've made snake, asteroids and Galaga clones in JavaScript. I had fun with them, and I threw the code over the wall for other people to look at; but for personal projects I am not promising anything other than that I had fun writing the code and playing the game I wrote.
It's absolutely possible to build JavaScript apps in a single page with no external dependencies. All you need is a single .html file and a simple development server (I use python http.server).
Writing in typescript is a easy as a single dev dependency to compile the code. There's no multithreading but first class async support.
Additionally, JS / TS are very flexible. You can implement almost any programming paradigm you want to learn. I love doing FP in typescript personally.
Pick something that sounds refreshing and fun to you. A few recommendations for you: make a game for a fantasy console like pico8, walk through an adafruit embedded project, or get interested in the front end / design part of web development (look through dribbble for inspiration). You don't necessarily need much CSS and it's not hard to learn anyway.
>> I feel like there aren't really any good options in software development any more. It's always one big compromise with lots of possible decision fatigue. Every direction has drawbacks.
It seems most of your dissatisfaction comes from whining about the tech stack. Either focus less on the technology stack and more about the end product, or stop attaching emotion to decisions that are best made logically. It's okay if you choose options that have drawbacks if every option has drawbacks. There's no such thing as a silver bullet. Choosing the wrong option is rarely going to kill your project and you can always change directions later so breathe easy.
Until recently, I was in a similar situation. I had an idea of what I wanted to do. I had some prototype code written up as a web app in JS. It was going to be this beautiful thing that would help so many people.
But then I realized it was too much pressure. I wanted this for myself more than anything else. So I sat down and hammered it out in python in an afternoon. (Full disclosure, python is my main language, and I already knew exactly what this thing needed to do. I also found a library that did the Hard Part for me.)
And the best part: when I tell certain people about what I built, they don't care that it's a janky CLI. They're just happy they don't have to build/commission it themselves.
Embrace jankiness and get something working. You'll have fun.
I’m sorry learning rust tho. Like it a lot.
Dart's "Rails" is Flutter, it lets you write apps for mobile on iOS, Android, web, desktop on Windows, Mac and Linux, and it's used on large enterprise projects, startups, and solopreneurs / pet projects.
Dart is a very consistent language (compared to others, at least), super easy to learn, null safety, great type system. You can write web apps with it even without Flutter (it can also compile to js), churn out command line tools, run your server, and write user interfaces for desktop, mobile and web apps with Flutter. It feels like it has the best parts of Java, Javascript.
It's been a fun couple of years for me and I created some fun stuff with Flutter and Dart, so if you want to try something new, consider taking a better look at them.
You just gotta pick something and go. I know nothing about your app, but there's plenty of general purpose languages out there that wouldn't be a bad choice. Over-optimizing is gonna kill the fun and you'll get nowhere. Choose some tech that solves your immediate problems and maybe keep things modular so you can break out the pieces that aren't working later.
Remember the fun part is building things. So go build something.
The one thing I'd say is: Let the project select your tools, not the reverse.
Take your time, select your tools and libraries... and it is amazing things just seem to come together. Not every problem will fall to what you know today.
Yes, there will be compromise, but step back, and ask yourself... just how thankful you'd be for any of these options 10+ years ago. If the answer is not... don't use that tool. But many times, what we face is really a plethora of great decisions, and we try to look for the best... not realizing it doesn't exist today, only in retrospect.
Lisp is the easiest, most fun language I've encountered to work in. It's like clay out of which you can sculpt a solution. Every programmer should give it a go.
For an even easier way to get started, consider building an app in Emacs Lisp. It needn't be huge, it could just be an automation for a pain point in your daily work. Emacs is easier, and more fun, to extend than just about any other editor.
I'm writing a cross-platform UI library (C++, but I hope to add Swift, Python, and maybe Rust bindings), because I'm in the same boat: https://github.com/eightbrains/uitk. It is usable, but still under development, and while the .h files are fairly heavily documented, there are no examples yet.
I suggest programming with chat-GPT. I got it to help me to get started, research and break down very ambitious project that alone I just couldn't muster.
You didn't specify exactly what you problem is but if you are looking for easy UI that's canvas based then I guess https://flutter.dev/ might be just for you.
Due to the constrained nature of the undead platform there is no real possibility of decision fatigue, since the ways of solving a problem are few.
You rightfully complained about the complexity of JavaScript or C++, but you don't have to use the majority of the features. With minimal external dependencies and no other programmers in the mix, you can choose a subset of the language and just stick with that.
It sounds like C/C++ would be a good fit if doing low level things is fun for you. Javascript/HTML/Canvas is also not a bad choice per se, you just don't need externalities such as bundlers, wasmers, deployers, dependency managers.
Whichever environment you decide to go with, start with an empty directory. NO package managers, either. If you absolutely must use an external library, copy it in deliberately and manually.
See how few things you actually need to make something fun and worthwhile!
The highlighted programs are mostly games, but people have made all sorts of fun things like 3D CAD, music synthesis, text editors, etc.
It is certainly a break from complexity. And it is easy to export your program as a webpage.
> no fancy interface, no visual helpers, no gui tools or editors... just coding in pure spartan-programmers way. Are you ready to enjoy coding?
Rust/Yew may be what you're looking for. It takes all the good ideas of web UIs (namely declarative FRP) and works cross platform natively, as well as compiling to WASM for the browser.
This has, literally always, been the case. You need to pick where you want to compromise, because there is no "one-fits-all" solution.
- Use Electron/Typescript/React/Tailwind or some similar stack if you want to pull together something quickly that works across multiple platforms
- Use Flutter if you want to do that but don't mind it's kinda poor re-implementation of platform-native widgets
- Use Qt if you don't mind the C++ dialect and complexity
- Keep it simple and use Dear Imgui
- Use something like Blazor to build a web app in C#
There are loads of options with different tradeoffs.
I created a little SaaS product with some HTML, VueJS 3 and Laravel for fun. No code reviews needed here. Also not my daily stack. Was quit funny ;). I have to mention I don't like JS very much and I was never a Frontend guy, but I gave VueJS a try. And I think somehow I finally found something to build nice Webpages without digging into React or using jQuery for now.
It was great relief and somehow I became a little aware that programming in the corporate world is relatively often just no fun. No idea what I'm doing with the knowledge currently. Cheer up and try to do some sports. I know, an often used advice, but it helps.
The whole environment makes the programming experience much better, and it's self-contained, so you don't need to spend a lot of time wrangling dependencies just to get started. Also there's a MOOC for it: https://mooc.pharo.org/
This way you can start very easy and learn about the cross-platform UIs later (if you by then still stick to the commitment to the project).
Learned golang last year, decided to refactor many projects in it. It makes cross-platform development a lot easier, except for native UIs (as of now). But fyne and others are getting there very quickly.
The core strength of golang is its build toolchain, with cross-compilation from Linux to anywhere, basically. Additionally it makes you "think in structs" due to how the language is designed, so serialization/deserialization can be pain at first but once you realize the benefits of un/marshalling, it's amazing.
The batteries-included approach of the golang core libraries + golang.org/x is a nice dev experience, there's all kinds of libraries in there that you could ever need, already available in pure golang (with zero C dependencies, so CGO_ENABLED=0 makes it as cross platform as it can get).
> I'm not a fan of the complexity
That is a very frequent trap many devs fall into when doing a video game. You start with the intention of programming a video game and you end up spending all your energy building a video game engine first. Resist that with all your might. I recommend trying to make a little game that "works" from the start, and then doing small improvements gradually while making sure that what you have is still a "working game". If you spend more than an hour with your game in a non-runnable state, revert to the previous commit and reassess.
Second problem complexity-wise is ... just incidental complexity. In general, 3D games are one order of magnitude more complex to do than 2d games, so I would recommend the later.
You could try doing something in PICO-8 [1]. It's a game dev environment with artificial limitations. Like the number of colors (16), the screen resolution (128x128) and others. It's programmed in a dialect of Lua, which is in itself a very tiny language. It is possible to make something overly complex with those limitations, but you have to try really hard. And it is fun.
I went back to coding stupid small games in a scheme-like Lisp on 8 and 16 bit cause.
I started out with Lisp in the 70s but followed the money to C, C++, Java and DotNet with side-trips into Smalltalk and Self. And a metric tonne of x86 16 bit assembly.
But I always had a fondness for Lisp and FORTH.
One thing I remember from the old days was (as Sussman pointed out) we used to build larger programs by composing smaller programs. Now we use monolithic blobs where you spend a lot of time writing tests to see how the API works because there's very little documentation (and it's a black box where a LOT of functionality is hidden behind a single API instead of smaller components you combine how you see fit. Look at any Microsoft Crypto API for an example.)
So my fun is now had on personal projects.
I have moved some professional projects over to Erlang and Elixr. Others use closure, and I get a similar feel. I feel like I'm in control. JavaScript used to give me that feeling, but my management chain insists we do things like import packages to test whether an object is null (and it turns out it does the comparison wrong.)
Your sense of "fun" will no doubt be different, but I guess my point is... the freedom to choose your development environment can provide a bit of happiness to your life. Not just what you work on.
edit: Material design is another good frontend option that lets you stop worrying about fiddling with design and CSS. There isn't as nice of a single framework for it like bootstrap though.
Let me know if it was useful for you! Good luck with everything!
This is my dream. Unfortunately there is no easy path to get there. We have to replace all the languages. Build replacements without the noise.
> looked good using tools only in that language
I think you can have a universal syntax, but not a universal language. I think Racket's term "Language Oriented Programming" is the holy grail. You need lots of DSLs because you almost always work across different domains.
It is possible to have a universal syntax, however ;)
The crucial thing was, speed of feedback-loop? And the expo stuff is good. It does the bundling, it has hot reload. I don't mind typescript and the embedded xml.
I'd say your best bet is find something cool you would like to build. Ideally, there will be some part you have to deeply focus on a tech problem that will require you to stop thinking about anything else and really immerse yourself. This would count even if it is only a few hours.
I've found it fun and useful to have a small list of tools/utils or mini projects that I could use day to day or even something I could just randomly say I built. It is also usually the case that for tech people the most joy comes from the idea and early stages of creation and then finally shipping it. I'd say it would be best to have one or two small projects you can definitely wrap up instead of a massive one that becomes a drudge.
Also focus on truly how much power we have with computers. It is one of the only disciplines where the biggest and almost only limitation is what you can imagine and design.
- Human friendly syntax
- Static compiled
- Type inference
- Incredible standard library
- Easy concurrency
- Incredible performance.
https://github.com/makepad/makepad
It's a Rust library for developing cross-platform apps. It's not 1.0 yet; there's still things to finish, but it's being actively developed (https://fosstodon.org/@rikarends#), and it's already pretty fun to play with. And the fact that it compiles and runs with the same widgets on Web as it does for Windows and Mac (Linux and Android are imminent, according to the dev's updates) makes it very appealing for my "write once, deploy anywhere" sensibilities.
Fast, easy, and free. Just waiting on it to be "live", for now! Don't forget to check out the demos.
https://makepad.nl/makepad/examples/fractal_zoom/src/index.h...
https://makepad.nl/makepad/examples/ironfish/src/index.html
I don't know what project you have in mind but what about targeting an older platform? If it's purely for fun/satisfaction try making an Amiga or DOS program. Plenty of emulators for modern platforms to help you run it on a Mac or Windows machine.
Depending on your project one route to consider is to build your UI with an immediate-mode style library (or write one yourself, it's not terribly difficult). You'd be sacrificing accessibility likely but it would get something out there fast that's pure code and doesn't require a ton of fiddling to get going.
Another "fun" area is to try Common Lisp or Emacs; both have options for UI and graphics programming and all usual facilities on modern systems. The benefit is that you can stay in warm-and-fuzzy parentheses and get a highly interactive development environment that you rarely have to leave.
Or Racket? https://racket-lang.org/
---
I only have a little experience with the suggestions above; I personally like SvelteKit, but it doesn't fit your requirements.
You will need a week or two learning curve if you are really good at picking up things. After that, the noise will fade away. You will be able to fully focus on building stuff and have fun.
If you are trying to interact with native platform in very advanced way, the non-fun parts will be back for a bit. It is still better than others.
The other day I wrote a little shell script to make a command-line radio player, which was rewarding.
I have a little shell script I wrote that is now a cron job on my laptop (running Arch GNU/Linux) that backs up my important files to a cloud using borg. That little bit of automation (a few dozen lines really) has been nice and fun to write, and gives me some good peace of mind.
Admittedly, some of shell script syntax (like that for hash maps) get take some time getting used to and is rather arcane, but I find running little scripts to do various day-to-day things around my life and the house rather fun.
Elm and elm-ui for the front end. Elm is so safe that with the exception of the FFI and OOM it cannot have runtime errors.
Rust for the backend. You already know C++ so borrowing (move semantics) references and whatnot should be pretty familiar. Rust is like C++ but without all the horrible baggage and swift esque type safety.
Other people are like build stuff with this! Build stuff with that! They don't get it. I know what you're looking for: type safety in a good language without the garbage. Look into the two things above^^^^
Anyway the thing that's sort of related here is functional programming. Swift and Rust both share the same creator and the type systems from both are derived from Functional programming languages like haskell and OCaml. Elm derives its syntax from the same family, but elm is strictly functional while rust is not.
If dealing with "front-end baggage" doesn't sound like fun to you, don't do a project that needs (much) front-end. Maybe you can build a bot (discord maybe?) instead? Or try some other interaction paradigm?
Or maybe abandon your project idea, and ask yourself what kind of project would be fun to implement, not fun to have finished implementing.
> I feel like there aren't really any good options in software development any more. It's always one big compromise with lots of possible decision fatigue. Every direction has drawbacks.
The beauty of a hobby project is that you can decide what's important for you. You can decide to screw portability, or accessibility, or security (as long as it's just on your device/home network), or whatever else feels like a burden to you.
It uses Java 17 and LibGdx for graphics, compiled to JS (Canvas) by TeaVM, and served by Micronaut.
Programming is not always about building the app foo with the language bar. You can have fun by recreating and understanding how existing stuff works.
I'm also attracted to implementing my app cross-platform.
I just want to have some fun writing something without headaches
Building cross-platform native apps is like consuming the contents of a bottle labeled "CONCENTRATED HEADACHES". Those two goals are fairly incompatible...
What I’ve been enjoying A TON lately is embedded development for hobby. Not Arduino, but bare metal, flipping registers and configuring devices in a STM32, writing linker scripts and scripting gdb.
It feels awesome to understand a system completely (sort of). I’m writing C but I also wrote the assembly that bootstraps my C environment and calls main()
That combined with some reverse engineering to figure out the MIDI protocol and a buzzer and LED and I’ve made a little instrument that I can play with my keyboard!
Next I’m planning to understand how USB works and maybe make the little instrument controllable over USB? Who knows!
I’ve realized that what I enjoy about programming is the puzzle, the thing that I don’t know, and then learning it, and then doing something fun with it.
Wish you the best and tons of fun in your journey!
Other than that I'd recommend C. It's ubiquitous and can be as simple as you want it to be. With macros or source to source transformation you can have your cake and eat it too by picking how you want your code to be written then figuring out how it would compile to C.
That's personal experience, of course, but the most "fun" I have in almost any task/topic/field is when it's not 'forced' on me by $WORK
And who knows, maybe this new knowledge will be useful professionally one day (I learned a lot about very low level computer concepts, and I didn’t know C before), but that is totally not the goal. Just the absence of the pressure to be useful brought back all the fun for me.
"Look! I built a whole App that does the thing! Isn't it cool? Oh, yea, you need to use this gnarly url and - crap - yea, use chrome. Refresh it... Hold on, let me restart the Raspberry Pi... Got it! Look at that! So cool! Wait - did someone HACK this?"
The grown up version of this might be just building for one platform, and one happy path. Who cares if lots of people can't use it? If it's popular, you can turn it into a job then. But until that happens - just make the computer do something cool!
https://explorerdude.net https://novagame.net https://choreomania.net
- QT in C++
- Electron in JS/TS
But if you want to avoid those then you could try the Rust GUI ecosystem. That gives you a few options:
- gtk-rs which uses GTK but allows you to write in Rust rather than C
- Dioxus which does use CSS layout (renders using Tauri webview under the hood) but allows you to write the code generating that in Rust. And the "backend" code is entirely Rust.
- Iced which is pure Rust with it's layout system. But tbh it's still pretty immature and you'll be writing a lot of widgets yourself.
You could also look at Flutter which works cross-platform and works completely within Dart.
People start build in public on Twitter. You might want to try it. Share your work, how you solve a problem, find a similar project that might be related with your work, have a discussion with the others to gain more ideas. I hope it help!. Good luck!
> I'm not a fan of the complexity...
My recommendation that helps me having joy: Just do something other than writing code for that particular app. Write a decent (build scripts)|(CI/CD pipeline) that will abstract away that complexity and will reduce cognitive load of building/testing/deploying an app. That's a good feeling.
Totally empathize. Why we ended up this way when "tech" has been eating the world for so long is another story...
One little corner that might be worth exploring is KDE apps based on QtQuick / Kirigami. You can leverage your C++ and deploy on android too.
Otherwise, my 2 cents is that I pretty much always have fun programming in Ruby.
You should try my (esoteric) programming language (theorem prover), Budge-TP :)
You might find useful my recent write-up about https://bor0.wordpress.com/2023/02/05/writing-your-third-pro...
Of course, if your most marketable skill is programming, then that strategy will likely involve a reduction in compensation. Whether or not that trade-off is worth it is something only you can answer.
You can find some fun projects in places least expected.
* https://github.com/JuliaDynamics/Agents.jl
Might be interesting.
If you want reliability, perpetuity and still some fun try Rust. https://www.rust-lang.org
You can... just not as a professional. Work kills the joy. As only a hobby it could be fun again.
My background is C and C++. I had tried fp before but it didn't stick. It gets awkward really quick. No such things with Elixir.
You build a form by dropping GUI elements into it, and hooking up events. It's almost trivial to build a CRUD application.
Yes, isn't a mainstream language but there are a lot of interesting things with it:
- build for .NET or languages supported by Fable (JavaScript, Dart*, Python*, Rust*, PHP*) - I did build a proof of concept Flutter app with it
- multiparadigm - FP or OO, you choose
- clean syntax - based on indent just like Python
- Type providers, type inference, ...
* These are on Fable 4.0.0-theta-018 at moment
monads, type-classes, pattern matching to get out of the imperative mindset from cpp, java,python, ruby
[to be clear avoid java, cpp,python, ruby]
c is needed for performance,
elixir/erlang for concurrency/parallelism,
haskell/racket/common lisp for enlightenment
I should probably work up the motivation to do that again come to think of it.
Btw, I'm looking into porting it to Windows and Linux, if anyone is interested... :P
There's no CSS. No useEffects. No BE vs FE. It's almost beautiful.
easily deploy wasm full-stack p2p apps
Per others, though, perhaps it's the motivation that's required. Do you want to write games?
Depending on your project, you might consider working on the backend and API to drive this app and contract/partner with somebody who can do a killer job on a great frontend.
Start with something you think is interesting and that you can do in an evening.
Do a little bit at a time.
It has grest WASM support, too.
Stuff like Bun.sh which is an entire JS platform is built upon Zig with a very small team. That speaks of Zig complexity.
Sounds snarky, but I'm serious. You can build anything with it, and it can be fun to use too.
No one could possibly suggest "fun" to you.
1) write some random control plane 2) create yaml interface for that control plane 3) watch how your users lose will to live
That is fun by definition
Try a project that's either completely useless or at least wildly impractical. Don't be afraid to throw away code.
you can try out your own shaders in a browser here: www.shadertoy.com
Java is Java. A nice aspect of Java is that you can find pretty much anything in Java. Not written in something else and integrated with Java. Written IN Java. That helps limit the long running impact of "dependency hell". Of course you'll have dependencies, but in the end you have a static distribution, and its the same code, across the platforms. I'm currently working with Apache Jena and RDF (and this has nothing to do with the semantic web). For my purposes, RDF is a hoot, and adding Jena to my project was drag and drop.
There are exceptions. JavaFX is one in itself, as it does have a platform dependent binary component. If you're lazy on tooling (I'm lazy, I hate tooling, I should say I hate fiddling with tooling), just bundle all the platforms everywhere. But you can also make platform specific builds. In the end though, you don't have any environmental dependencies. All of them are brought with you. You can static link lots of things, but in Java, its routine.
Java is evolving into a multi-paradigm language. Still dominantly OOP, but it has the low hanging fruit of others as well. All of it is imperfect, but it's pragmatic as all get out.
JavaFX is a pretty solid piece of kit. It's modern, it's STILL modern. As old as it is, its held up really well. It's different, it's not Swing by any measure. My hurdles picking it up was taking preconceived notions learned from older frameworks and trying to square peg round hole them into FX. FX is opinionated enough to make that kind of effort frustrating.
But it comes with a scene graph. It comes with CSS. It comes with animation. It comes with 3D. It even has boolean 2D geometry operations. It comes with a bevy of layout containers. It has GUI screen builder. It has FXML, which is an XML based format for specifying scene graphs. With a bit of boiler plate, you can actually do entire screens and logic in an FXML file with embedded JavaScript, if you're so inclined. Perhaps not the greatest idea, but for certain applications the idea of being able to have an end user add a screen to your application can be very interesting.
I really like the Property and Binding mechanic. It's one of those things that's compelling and can lead to abuse and trouble. But that's OK. Just dial it back and it sings. It can also be used for simple rules, or as a simple constraint system.
Make no mistake, there will be battles. But for me, someone who hates Fiddly. Who tolerates tooling. Having everything underneath the one overarching canopy of the JDK is useful. But, it's still Java. Java can be wordy, to be sure. This doesn't bother me so much. Even my Common Lisp is wordy. CLOS isn't a poster child of terse coding. You still have your setters/getters (that can be sort of mitigated with the lombok project, but it doesn't have support for the JavaFX property idioms).
I do have one complaint about FX. The components and such are pretty locked down. It's really hard to extend them in ways they're not designed to be extended. Which means if something you're working with won't work for you, its baby out with the bathwater.
I've been playing with it all year. I have several half baked projects floating about. It's all been mostly fun for me. Desktop GUI work has a lot of minutia, which I've never been very good at. It's also a GUI, which is about presentation, and make this blue, and that 3 pts bigger and line all this up and can we have a shadow here. Most of which I hate. But that's an inner conflict unrelated to the environment. That's just GUIs and bike shedding. I've suffered this since they offered color to smart terminals.
GUIs also have a bunch of things that have nothing to do with your application per se. Global state, where do you put the logs, preferences (dare I mention Java has a cross platform preferences API built in?), perhaps capturing window layout on close, etc. I wish I could point to simple framework that supplies all that, but I can't. They exist, they're not simple, they come with a lot of baggage. That may or may not be "fun" for you.