Ask HN: How to rediscover the joy of programming?

483 points by throwaway2951 ↗ HN
I remember in my teens I used to love programming. After 20 years of a career, I don't enjoy it anymore.

Have you rediscovered the joy of programming? Any advice?

336 comments

[ 3.5 ms ] story [ 326 ms ] thread
Programming is 1,000 room hotel of which we live in only one.

I recommend you study different programming paradigms because in them we can find really interesting approaches to solve problems.

For me those have been:

- functional programming (with Haskell) - logic programming (prolog) - Constraint Programming with the excellent Coursera class on minizinc.

Those paradigms made programming fun again for me.

PS: I also stay away from JavaScript... When I was working with JS.. I was seriously considering leaving programming... Thankfully I changed jobs and I haven't had to touch it anymore.

What was it about JavaScript that wanted you to leave programming? I'm just curious.

    0.1 + 0.2 → 0.30000000000000004
That's not unique to JS.

  $ irb
  irb(main):001:0> 0.1 + 0.2
  => 0.30000000000000004
  irb(main):002:0>


  $ iex
  Erlang/OTP 22 [erts-10.6.2] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async-threads:1] [hipe]

  Interactive Elixir (1.10.2) - press Ctrl+C to exit (type h() ENTER for help)
  iex(1)> 0.1 + 0.2
  0.30000000000000004
  iex(2)>

  $ python
  Python 2.7.17 (default, Dec  2 2019, 13:23:33)
  [GCC 4.2.1 Compatible Apple LLVM 11.0.0 (clang-1100.0.33.12)] on darwin
  Type "help", "copyright", "credits" or "license" for more information.
  >>> 0.1 + 0.2
  0.30000000000000004
  >>>
Interestingly, though, some languages get it right:

    northrup@Topaz:~/Desktop$ perl -de1
    
    Loading DB routines from perl5db.pl version 1.55
    Editor support available.
    
    Enter h or 'h h' for help, or 'man perldebug' for more help.
    
    main::(-e:1): 1
      DB<1> say 0.1 + 0.2
    0.3
[…]

    northrup@Topaz:~$ csi
    CHICKEN
    (c) 2008-2019, The CHICKEN Team
    (c) 2000-2007, Felix L. Winkelmann
    Version 5.1.0 (rev 8e62f718)
    linux-unix-gnu-x86-64 [ 64bit dload ptables ]
    
    #;1> (+ 0.1 0.2)
    0.3
[…]

    northrup@Topaz:~$ sbcl
    This is SBCL 1.5.8, an implementation of ANSI Common Lisp.
    More information about SBCL is available at <http://www.sbcl.org/>.
    
    SBCL is free software, provided as is, with absolutely no warranty.
    It is mostly in the public domain; some portions are provided under
    BSD-style licenses.  See the CREDITS and COPYING files in the
    distribution for more information.
    * (+ 0.1 0.2)
    0.3
Unless they're using an alternate exact representation for floats by default, that's just rounding them when printing.
That's a fair point about the Perl example, but Scheme and Common Lisp (including both Chicken and SBCL, last I checked) support (if not outright require) full numeric towers with rational number types, so these are indeed exact representations (unless you explicitly request binary floats for e.g. performance reasons) and not just rounding during printing.

There are lots of other examples of doing it "right" (using more suitable numeric types) over at https://0.30000000000000004.com/ (alongside a bunch of examples that, to your point, just round, or to the GP's point, just stick to binary floats).

It depends. Do you want deterministic compute time? Then you have to settle for something inaccurate.
I am aware of numeric towers and actually checked whether that was going on.

sbcl 1.4.16 uses single floats: https://ideone.com/ruw5qi

I don't know enough about Scheme to dig under the covers to see how it's being represented internally.

sbcl (and other Common Lisps) uses what you want it to use: read-default-float-format

(setf read-default-float-format 'single-float) (+ 0.1 0.2) => 0.3

(setf read-default-float-format 'double-float) (+ 0.1 0.2) => 0.30000000000000004

On LispWorks 7.0 I get 0.30000000000000005 for double-float. Hmm.

Scheme is the same. If you type a number with a dot in it, you'll get an "inexact" number, which is floating point. If you prefix it with #e, you'll get an exact representation of the entered number (so, e.g. #e0.1 gives you 1/10)

The output of inexact numbers is typically truncated. In CHICKEN, you can use flonum-print-precision to tweak that. In an example, straight from the manual:

    > (flonum-print-precision 17)
    > 0.1
    0.10000000000000001
Per my other comment, SBCL's defaults still cause (= (- (+ 0.1 0.2) 0.3) 0) → T. I guess they're technically floats (or at the very least not rationals) given that (= 0.3 3/10) → NIL.
Yeah, in CL the 0.1 is read syntax for a float (IEEE-754ish on most modern implementations.) If you want exactly 0.1, you’d have to say 1/10. The printer is probably cheating and rounding to the output you expect (I think Python 3 may do this now?)

Aside from financial applications, there’s very little reason to care about the trailing remainder.

> The printer is probably cheating and rounding to the output you expect

    northrup@Topaz:~$ sbcl
    This is SBCL 1.5.8, an implementation of ANSI Common Lisp.
    More information about SBCL is available at <http://www.sbcl.org/>.
    
    SBCL is free software, provided as is, with absolutely no warranty.
    It is mostly in the public domain; some portions are provided under
    BSD-style licenses.  See the CREDITS and COPYING files in the
    distribution for more information.
    * (= (+ 0.1 0.2) 0.3)
    T
    * (= (- (+ 0.1 0.2) 0.3) 0)
    T
> Aside from financial applications

"Financial applications" happen to be pretty common reasons for number crunching :)

This just means that 0.3 has the same internal representation as the result of (0.1 + 0.2).

Internally, they're probably both 0.30000000000000004 (depending on precision), so an equality check returns true.

It could also be that they're both 3/10 rational numbers, but given other tests in this thread that's likely not the case out the box.

    northrup@Topaz:~$ sbcl
    This is SBCL 1.5.8, an implementation of ANSI Common Lisp.
    More information about SBCL is available at <http://www.sbcl.org/>.
    
    SBCL is free software, provided as is, with absolutely no warranty.
    It is mostly in the public domain; some portions are provided under
    BSD-style licenses.  See the CREDITS and COPYING files in the
    distribution for more information.
    * (- 0.3 3/10)
    0.0
    * (= (- 0.3 3/10) 0)
    T
    * (= (- 3/10 0.3) 0)
    T
    * (= 0.3 3/10)
    NIL
So yeah, 0.3 and 3/10 are definitely distinct, but still apparently net out to exactly 0 nonetheless.

    CL-USER(3): (rational (+ 0.1 0.2))
    
    5033165/16777216
    CL-USER(3): (rational 0.3)
    
    5033165/16777216
I don't think it's so much a matter of getting it right as much as it is about preferring the performance gain and ease of use of hardware-accelerated constant-space floating-point numbers. At least, that was probably the case when programming in something like C/C++. I don't imagine there's much point to it in ruby or python for example, other than that floating-point is standard by now.
Comparing lisps with their full numeric towers to run of the mill procedural languages is a little unfair ;)
I have burnt myself once with perl: numbers that are printed the same are not necessarily equal.

  DB<1> say((0.1+0.2) != 0.3)
  1
that is floating point for you, not Perl
I know, it was just a tongue-in-cheek comment but oh well
(comment deleted)
That’s because you are running it on hardware implementing IEEE 754 floating point.
As someone considering leaving the web development industry after 12 years:

JavaScript is a never ending grind.

Callbacks, then Bluebird, then Promises, then a sync await.

a new testing framework every six months. a new web framework every couple of years. aimless, massive changes to the language (classes in a prototyped language? Why not).

JavaScript then coffeescript then three versions of typescript. too many UI libraries to mention.

JavaScript on the server? the people making the most popular web framework abandoned it 5 years ago but who cares?!

paradigms that make no sense (react morphing from a UI library to the full app). a million ways to manage state.

then you have a few big players calling all the shots (FB, MS). I guess we use functional components now. Eurasia has always been at war with Oceana.

It’s tiring. I’ve spent my entire career doing this stuff; and I’m never quite good enough before The Next Big Thing comes along.

I know things change over time everywhere, but it’s hard to imagine anything moving faster with less purpose than the JS ecosystem.

(Apologies for typos and grammar; I’m on my phone)

'JavaScript is a never ending grind' - Wow no better way to summarize it than that. The funny thing is that I've always felt that Javascript the language is pretty straight forward and easy to comprehend. As someone who primarily writes Ruby and really appreciates the functional style of writing code, Javascript lends itself to that style very easily.

But the ecosystem around is just that never ending grind. At my last job, over the 3 or so years I was working fully stack, it was just a constant churn. Start with React / Redux / SRR / Jest / Mocha / (probably some other testing frameworks) / Flow. By the end none of the original testing frameworks were being used. React had introduced Hooks, which I actually like, but it was a whole new paradigm to learn again. Flow was out and we needed to migrate to Typescript as quick as possible. And this is just the React ecosystem!

React has its place and I'm definitely comfortable working with it (also writing 0 tests cause I have no idea where to even start for that) but I'm looking forward to the day maybe simple web apps get back to simple setups. Projects like LiveView[0] for Phoenix really give that hope.

[0] - https://github.com/phoenixframework/phoenix_live_view

>I've always felt that Javascript the language is pretty straight forward and easy to comprehend

While that's true, the completely opposite is true for Javascript the ecosystem.

I don't have much time for this cr*p, nor do I like it, so I tend to use olde fashioned JS + libraries like jQuery for old fashioned multi page web apps. I want to learn Blazor and Vue for SPAs to keep it more simple.

It's like you have to constantly keep learning, but nothing you learn really matters in any deep way. It's just new names and APIs for the same stuff, month after month.

Imagine if you were a woodworker making furniture. You make the same furniture every day and love your craft. But every month, someone shows up, takes all your hand tools, and replaces them all with a set that are mostly the same but slightly different and all have completely different names.

1000x this. One of my pet peeves is the idea that all learning is equally worthwhile. It's possible to waste one's life "learning" the inane and shallow, and it's a suffocating experience when it happens.
I was a game developer and I pretty much grew to dislike what I had to do at my former job. Doing same kind of mindless games, over, and over and over and pretty much repeating things.

I got into web development, but for me that means mostly back end. I pretty much dislike big opinionated JS frameworks like Angular, although I have to learn it and I will since I took over a project which uses Angular on front-end. Sometimes I generate HTML on the server side, when I can, using a bit of old fashioned JS and jQuery where is needed. Sometimes I write a REST API for backend and write the frontend using good old fashioned HTML, CSS, JS and jQuery. I like this two approaches the most.

Now I'm planning to learn Blazor and Vue for SPA development.

A lot of this is a direct result of feeling that one always needs to be on the bleeding edge, which is both unnecessary and also a recipe for wasting time on fads.

As an analogy, consider fiction. Imagine reading as many new novels as possible as they're released. Well, most of these novels will be completely irrelevant 5 years from now. The good ones stand the test of time. So you might as well only read novels that are 5+ years old, yet are still relevant and receive acclaim.

If you worry that taking this approach with JavaScript will make you fall behind, my question is: Behind whom, exactly?

There's no way many in the industry can keep up with all the changes you listed as fast as they're coming out. Therefore, it follows that a great many of your JS developer peers are "behind." Therefore, it's okay for you to be, too.

What happens to me, personally, is I start on some new project or company using a pretty recent stack at the time. Over the course of the next few years, that stack becomes "outdated" as new things are released. However, it also matures as its documentation improves and its community grows. Eventually, after 2-5 years, I move on to another project, and just take that time to catch up on the latest. The result is that I end up skipping a lot of the fads that die on the vine. For example, I largely missed CoffeeScript.

I think a lot of pain from JS comes from the expectation that one can and should keep up, when you probably can't, and definitely shouldn't.

> A lot of this is a direct result of feeling that one always needs to be on the bleeding edge, which is both unnecessary and also a recipe for wasting time on fads.

It's also because the JS ecosystem is absolutely massive -- too massive. Instead of consolidating around a good package, people create a new one. You end up with a small number of contributors (often one) per library, and being on the bleeding edge is the only way to make sure your dependencies are maintained.

Javascript's biggest problem is its lack of a standard library. Hence the ridiculous churn of trivial libraries such as leftpad.
Lack of standard library doesn't account for web framework churn, though. Momentarily seemed like we had coalesced around Vue and React, and here comes Svelte, among others. It's incessant.
React was released 7 years ago in may and is definitely the most dominant framework and going very strong, and will be a good career investment for years to come. I think framing that "momentarily" for yourself is making yourself very unhappy - life changes constantly, as we see with this pandemic, and we need to have a little bit or willingness to accept change every five years or so, or perhaps we need to choose a field that has less competition (which is also why we enjoy great benefits and great pay). It should also be noted that both Vue and Svelte are extremely similar paradigms to React, and not at all the big paradigm shift that we saw from Angular to React.
React is its own ecosystem at this point. I can't even keep up with React state management libraries...
That feeling of not having mastery of your tools is part of the problem.
> A lot of this is a direct result of feeling that one always needs to be on the bleeding edge, which is both unnecessary and also a recipe for wasting time on fads.

The problem with this is that everyone jumps on new fads so quickly that, if you don't, you're likely to endup with a bug-ridden, half-baked, vulnerability-riddled, unmaintained/abandoned, slowly collapsing, termite-infested framework as the basis of your entire SAAS business, or whatever it is you're trying to run on something that even the creators abandoned for the next fad.

> What happens to me, personally, is I start on some new project or company using a pretty recent stack at the time. Over the course of the next few years, that stack becomes "outdated" as new things are released. However, it also matures as its documentation improves and its community grows.

You have to be very, very lucky to accidentally end up with a "pretty recent stack" that will still be maintained in five years. On the other hand, the next part shows that you don't actually go with the 5+ year old "stood the test of time" tools:

> Eventually, after 2-5 years, I move on to another project, and just take that time to catch up on the latest.

Having to learn a whole new sub-ecosystem in as little as two years is exactly the kind of mind-destroying grind everyone's complaining about. I don't think anyone's just jumping on the newest thing that appears every six months; they're all just having to move to some new toolset every two to five years and burning out ten years into a career because otherwise they'll end up having to be the new maintainers of whatever tools they're using due to the fact nobody else is using them (and thus no one else is maintaining them) any longer.

Oh, yeah, and if I have to learn a whole new fucking sub-ecosystem and new version of the language itself with a bunch of breaking changes every two to five years, I don't have any time to spend learning fun things like a whole new language designed around a whole new paradigm.

ECMAScript and everything that touches it has become an actually focused bane for the joy of programming. It was fun just writing some clean plumbing for JavaScript applications in the past, but everything else about the process always ended up involving a bunch of scrambling to catch up with rapidly changing technology, planted on shifting sands even while I'm working with it, any time I start on a new project, where all I'm learning is a new set of persnickety conventions that will punish me if my approach is "wrong", force new work-arounds on me, and generally suck up all my time learning new rules to follow instead of interesting new ways of thinking about things that make me a better programmer and software designer.

Learning the interesting stuff, and figuring out new approaches to new problems based on the needs of those problems (and not the whims of the community), is a lot of what makes programming fun for many of us.

Linux exhausts me similarly.

* ALSA; esound; PulseAudio; etc. Just give me updated OSS or sndio on a BSD Unix system. That shit is stable, well-maintained, and not arbitrarily different every few years.

* SysV; upstart; systemd; etc. Just give me BSD RC. Maybe it's not ideal, but shit, it isn't swallowing 80% of userland with eventual ambitions of conquering the kernel and some of the worst defaults I've ever seen.

I'll just stop now, but I could go on for days in this vein. Maybe some of these tools are great, but I don't expect any of them to remain ascendant for more than five years in a form that is effectively recognizable by any significant measure but its name. The churn drives me insane. One of the reasons I aimed for software development in my professional life, abandoning the system and network administration (aka "ops") side of thing, was to escape all that crap. I want to write quality code, build new things and improve existing things, not participate in a rat-race to remain relevant just to have acquired nothing enduring from decades of effort other than stock options and a nice car.

Well said, I was close to 8 years in web development and jumped ship a little over a year ago. Working in javascript development felt like a hamster wheel but maybe I just needed something different.
Might I ask where you work now and how you jumped ship?
I can't empathise with it being a grind - keeping up with the latest developments only makes sense if you need to for your job or the new thing brings something genuinely useful.

However, JavaScript as application code just feels entirely verbose. I guess coming from a very opinionated framework like Rails leaves you sheltered, but I'd rather use a technology designed for the task I'm trying to accomplish than to shoehorn JS into something else.

Personally I find no elegance in JS, and writing it feels like a chore. If I had to do that daily I'd want to quit too. Obviously YMMV, but I get no joy in trying to fit the tool to the job, I'd rather just use another tool.

One of the reasons it's so popular is because JS is like Latin. If you know some words from one Latinate language, you could blag your way around half of Europe, probably order a meal and find directions. If you know some JS syntax, you can scrape by using half the tools out there today, and accomplish a bunch of different things.

If you want to go and live somewhere though, it's better to learn the native tongue.

I'm one of those "weirdos" who loves writing JS, and yet I agree with everything you just said being horrible. But I enjoy writing plain JS, that doesn't mean react, angular... i've run out of examples because I honestly don't care about those things.

However, I'm in a position where I have enough autonomy to avoid all that crap and just use the bits I like. When you get minimal and ignore all of the noise about the latest hotness JS libraries, the plain language (not including the lanky browser APIs) is not unpleasant especially over the last few years where some modern syntactic features were added - You can go even further and be selective of the language itself and it can get even more pleasantly minimal, my recent delight has been excluding classes and prototypes as much as possible.

When you take this approach the whole "churn" issue disappears (JS is backwards compatible, you will never have the issues you have with Rust or Elm forcing you to re-write).

I suppose this is the argument many make for C++ which is that, yes it can be a complex nightmare, or (if you are able) you can restrict yourself to a desirable subset and have a happy time. In JS's case, most of the complexity is from "keeping up" with the community and libraries, not the core language itself.

I enjoyed the hell out of writing application plumbing, but the moment it started turning into an actual application that interacted with the outside world I was dealing with the hell of the Node ecosystem of "compiling" and packing for the browser, framework crap, buggy testing libraries, and all the rest of that nonsense, with an acutely clear understanding that all of it would change in five years and I would have almost zero useful knowledge from the tooling and ecosystem experience of the preceding half-decade.

In the mainstream professional JavaScript world, my advice is to escape as quickly as you can, and pursue things where the learning focus is on more interesting things than the arbitrary whims of the authors of half-baked (because they never have time to mature before they die) frameworks. If you can just live on the fringes and write JavaScript your way and not worry about constantly impending obsolescence of your entire technology stack (from Linux all the way up to your JavaScripty CSS framework), though, I'm sure you can have a great time doing it.

I'm writing a lot of C and Ruby these days, and I love it. I get to learn more about myself as a programmer, instead of more about other programmers as fly-by-night framework developers.

I'm not really sure what you mean by "constantly impending obsolescence", but as one anecdote in the face of that: I have plenty of core JS code in production that was written 3-4 years ago. I've gradually improved or changed parts of this codebase but that had absolutely nothing to do with external libraries of which I use very few... this feels very unchanging to me, my code is not about to implode due to any external reasons.

I write my own UI/MVC type code from scratch just because that's the way I roll and my requirements there are a combination of minimal, extremely performance sensitive and in many cases esoteric where I have to write the UI anway so it's not much work compared to forcing existing libraries to do what i want... but if had to I could replace it with some hip and upcoming UI + MVC library and still keep 95% of my core code completely independent and intact.

I think JS world feels like massive churn if 90% of what you are doing is UI UX etc, because that's the interface that can never sit still in the name of progress... either that or you (not you necessarily) are doing it wrong and not separating UI code from your application code (I've seen this happen quite a bit in ye olden angular days where everything becomes attached to angular for no apparent reason, and angular itself is the worst of OOP + MVC where everything is convoluted and difficult to follow).

If you're basically building everything from scratch, of course you aren't going to see the churn as much.

If you build on others' frameworks, and those frameworks drop out of maintenance because the maintainers moved on to shiny new things, any security vulnerabilities or emerging incompatibilities with browsers can quickly prove ruinous for people who used those frameworks.

I wrote a SPA while working at a consultancy. It was actually pretty churn-proof the way I wrote it, but during one vacation day and the following weekend a couple people (including the boss) just rewrote the whole thing to use more faddish framework stuff. I don't work there any longer, but since then (about 2016) they've probably had to effectively rewrite it twice if they kept up with that approach.

That's what I mean by "constantly impending obsolescence".

Maybe I haven't been doing this for long enough (~8 years), but I think we're starting to see a plateau in JS-land.

I jumped into React early-on (5 years ago), and it's still going strong, and has been for way longer than Angular / Backbone / ExtJs ever did.

I wouldn't say Express is abandoned, I feel it's more that it's "matured". I mean what else can you add / improve?

State management is still an un-settled area; 2 years ago it seemed like Redux was the best choice, but GraphQL / Apollo is eating its lunch. However, when you think about it it still follows a similar conceptual model, but making it even more declarative: You have your "store" (the query result), and you dispatch "actions" to modify that store (the mutations). You just don't have to dispatch an action to fetch data from the server anymore; Apollo handles that for you.

It's true that JS churned very fast for a long time, but I'm seeing signs of it slowing down as problem areas become "settled" one-by-one.

Let me know when it's done settling in ECMAScript Land, then. In the meantime, I'm doing interesting stuff Somewhere Else.
I felt exactly the same thing the last few weeks but I have no idea what to do with it. Not sure how I would approach transitioning to another role really.
I've found that this grind is conquerable. There are only so many ways to go before you start to see the fundamental patterns, and friction in picking up anything new becomes seriously minimal. It's like how some other comments are, talking about how most of programming is really just data access and some clever gluing of frameworks. Or like how there are already software patterns, especially in OP.

My point is, you start to glimpse these overarching patterns as you interact with different takes, and you learn what works and what doesn't, ultimately empowering you to intelligently make tradeoffs or designs of your own. The chaos of web development is, IMO, because it was a new frontier, and a lot of inexperienced leadership occurred. This was compounded by bootcamps churning out people experienced only in Framework X, causing poor re-implementations of nearly _everything else_ inside Framework X.

It sounds like you feel like you _have_ to keep up with these things - perhaps someone else on the team is constantly insisting on migration, but they don't have to go through and tediously migrate and test everything. I'd suspect this lack of autonomy is at the core of your dissatisfaction. You can, and should, say no to a lot of trends, and if you do pick up something new, you should be able to clearly articulate why it's valuable, and these values should be more than superficial.

Another thing worth noting is that the release you work on today is the "legacy, painful" code of tomorrow. But that's a good problem to have - it got the job done. It just happened to get it done in one way, when there are really N ways, and so obviously the numbers game will work against you eventually, even in the imaginary case where the implementation is perfect.

Nailed it!

I've been programming professionally for 20 years and doing exclusively frontend with React since about 2014.

After the whole React Hooks thing, I can't freaking wait to do something else; and I'm absolutely livid with their decision to promote Hooks.

They should have forked React instead of introducing that into a somewhat mature ecosystem. Already went through this fractured bullshit with Coffeescript, and a million other frameworks of the moment. The JS community just doesn't learn, and when you see a big player like Facebook making the same mistakes, there really isn't much hope.

12+ years PHP and simple JavaScript programmer here. I loved programming and building websites.

Then I got into modern JavaScript with Reactjs, Nodejs, TypeScript, and other mess. Initially, I was excited because that's what everyone was and still is talking about and I love learning new things.

But it is too ugly in JavaScript land. People make fun of PHP but with PSR standards it is easy to enforce coding standards. In JavaScript land, everyone has their own standards, no easy way to enforce them, but most people don't follow their own standards. It is ugly spaghetti code mostly. Debugging tool is browser which makes it nearly impossible to troubleshoot when you are dealing with tons of minimized libraries. And even when you are dealing with simplest tasks JS developers start looking for libraries instead of just writing 5 line function.

I was ready to leave programming for management or other jobs but changed my mind and learning embedded systems, game dev, and some other cool techs. Hoping to transition to robotics or something else soon.

What’s wrong with js?
Not OP, but I personally could not use JS, and would outright refuse to use, in production. It's fraught with headaches that seem trivial but drastically change control flow, == and === being my favourite example. Linters help, but it feels like a band-aid solution.

I've had good fun with JS in my own time (where else can you get a GLES window up in 3 lines of code?), and I've written my fair share of helper application that notify me of certain album releases. But I would never ship something using it (and in fact I generally switch to Dart if I get serious enough about a web project, another band-aid solution). It could be preference, or it could be the years of embedded programming expecting timely results with minimum overhead (make no mistake, a modern web browser is a hell of an overhead).

>where else can you get a GLES window up in 3 lines of code?

Everywhere somebody built an abstraction to do it.

#include <SDL.h>

...........

SDL_Init(SDL_INIT_VIDEO);

SDL_Window *window = SDL_CreateWindow("MyApp", 0, 0, 1920, 1080, 0);

It's rushed half-finished edge case riddled language with awful tooling. Some of the issues are outlined here: https://blogtitle.github.io/lets-talk-about-javascript/

Of the many programming languages I have used over the last 20 years, there are several I prefer, several I would rather not use, but PHP and Javascript are the only two I refuse to ever touch again because they are so utterly unpleasant to write anything in.

It also makes my life as an end user miserable on the web on account of the gigantic gobs of program I have to download to make even simple websites work these days, when most could work just as well as a simple HTML page served from a server that didn't somehow manage to spin the fans on my powerful laptop just so it could show me some fancy font and I utterly resent the language, and the developers choice of it for forcing this on me.

Apart from all that, there's nothing wrong with Javascript at all.

I find it ok for it's intended original use, which is browser scripting. It's totally fine to write small JS scripts to make the pages a bit more interactive.

People got it wrong when they started writing huge applications in JS.

Just because a language is Turing complete, it doesn't mean it's fitted for everything.

It's like you did your job fine as a carpenter using carpenter's tools and you get a dentist job, but you insist on using carpenter's tools because you already know them.

Yeah, I've recently started using Stimulus JS for the odd enhancement to web pages on a personal project. That's far enough.

Interestingly I believe the sendmail config file syntax is Turing complete. You could theoretically create a web app using SMTP as the backend API.

Jumping in this post to recommend the exact same idea. Learn a new language outside the type of language you're used to using. I've been using my extra time indoors to learn Clojure and Forth. The things I'm learning are already changing the way I write Swift. I'm also excited about making things on microcontrollers again because Forth gives me a way to escape the horrible tooling forced on us by the chip manufacturers.
Forth was the answer, at least for me.

It's hard to explain, but no other language has given me such joy in perhaps decades.

If you look back on those times where you just had a booklet and a simple BASIC interpreter or C64 Assembler crafting your tiny little applications and games without third party libraries, distracting ceremony and best-practices anxiety. Those times where you could be so proud of every little achievement because it was truly yours, and that for some reason felt your most productive years... Then you might want to give it a go.

Just don't fall for the trap of developing your own Forth. Even if that's part of the philosophy of it :)

Now I just wished there was a book akin to "Land of Lisp" but in Forth. Maybe one should...

I used to love Forth. I haven't written Forth code since the 80's. Maybe it's time to try it again.
Besides trying out new languages and paradigms, I would also suggest programming things of a kind different from what OP's used to. For example, if they mainly do CRUD webapps at work, maybe they can start looking into creating games, a language, (programmed) music, screensavers, etc. Whatever they think is cool. It doesn't need to be big.
I second the nod to logic programming. I've been working on a board game engine in Prolog as a side project, and I'm having the most fun programming I've had in a very long time :)
Can you recommend some prolog learning resources? I googled a lot but it's still kinda hard for me to grok - especially CLP.
I recommend starting with [0] to get a feel for what's possible. [1] is great when you have time to dive deeper. [2] is good motivation, and [3] will show you how to build a practical roles & permissions system.

Keep in mind that you don't have to build your app in 100% prolog to use prolog. There are likely implementations in your favorite language. For example, Rust[a] JavaScript[b], and Ruby[c].

[0] https://learnxinyminutes.com/docs/prolog/ [1] https://www.metalevel.at/prolog [2] https://youtu.be/G_eYTctGZw8 [3] https://github.com/TheClause/learn-prolog/blob/master/articl...

[a] https://github.com/mthom/scryer-prolog [b] http://tau-prolog.org/ [c] https://github.com/preston/ruby-prolog

This is going to be personal and dependent on the person, but for me the opposite advice was useful.

I.e. stop programming for the sake of programming. A new paradigm, language or methodology to be more efficient.

Instead solve problems, and use the tools at hand, my excitement from programming originally was the idea that I could build anything.

Couldn't agree more with this. After 15 years of OO with Java/Ruby/Javascript I switched to Elixir and Elm and have really enjoyed not just the freshness of something new but the elegance of the more mathematical approach that functional programming leans on. 3 years on and I'm enjoying coding more now than I ever have.
When I first started learning to program. Every three months I switched languages/stacks, re-implemented a project in that language. Trying to learn the different approaches to development.

I also brought this on when I was a tech lead. Twice a month we would do code katas. Where we would do exercises together in a new language, or library. To continue learning, see if we could do things better.

I ended up in a similar place Functional(ocaml/ML) and multi platform (shared code for back end, mobile, web, and ops).

One of the problems I'm having right now, and is making me want to leave software. I can't find many roles that match that style. My brain hard locks when I try and go back to OOP at this point. I love programming, and working with the community. But right now I feel like I'm banging my head into a wall. Has any one else had this problem?

How about discovering the joy of the wide world outside programming? Why lock yourself in the same box you've been in for 20+ years?
(comment deleted)
there are a number of video games by ZachTronics in which you program in assembly language for fictional computer architectures in a sci-fi settings. “Shenzhen I/O” and “Exapunks” are both fun.
They really manage to strip it off to the problem-solving and optimization, with a clearly defined scope. No architecture, very small design choices, no compatibility, build errors, package versions, Stackoverflow, compiler issues, "am-i-solving-the-right-problem" etc.
For me, I took 2 years off of programming entirely and did something completely unrelated (started a monthly subscription box, so mostly marketing/sales/procurement).

I was completely burned out and couldn't stand to code even side projects when I started the hiatus. When I was ready and got back into it again, the passion was 100% back. Still going strong 3 years since.

How did you start a monthly subscription box without programming? outsourcing? hiring?
I used Cratejoy to handle the e-commerce backend, so the extent of it was some minor HTML/CSS work. There's existing solutions for Shopify that do the same as well, so no programming needed.

Later on (still running 5 years later), when I got back into coding again, I got rid of Cratejoy and wrote the backend from scratch in Ruby.

how is your subscription box business now? is it stronger due to COVID?
Yeah, shockingly enough despite the economic situation. Business-wise, it's been the best quarter yet, outpacing even holiday gifting peaks.
Take a 6 months break and don't use a computer during that time. Then see how you feel.
Not everyone can do that.
I would argue most programmers can do that, if the desire is strong enough. You might have to lower your standard of living drastically, but it's possible for most of us.
I manage to do it every so often, mostly because I stumble into a problem far outside my usual domain and I avtually feel technically and intellectually challenged again.
I similarly have loved programming ever since I was a teenager, and had grown super-cynical about the whole enterprise until about a year ago, and now am 100% back in love. The biggest reason for this is shifting my focus from "programming as a job" to "programming as creative act", somewhat a la our gracious hosts article:

http://www.paulgraham.com/hp.html

In order to actually make that shift I personally was recommended the book "The Artist's Way" by Julia Cameron. If you are anything like me you may experience an intense aversion to something so "artsy", and I 100% understand. BUT I decided that since following that instinct had led me to what I thought was a dreary dead end of bad code forever, I should at least give it a chance, and it was indeed as effective as promised.

Joy is out there, don't lose hope, and good luck!

Stop programming. Do something entirely different (painting, through hike, buy a one way ticket and wander, landscaping, sculpture, etc.). Let the well refill. If you're not financially able to take such a break, start saving like mad. Put a stake in the sand (say two years hence) when you will stop to recover.
I had the same issue. Then I went back to the roots: Lisp

And learned Clojure.

You will feel like you know nothing. You will feel handicapped. You will be confused.

Then, one day, you will understand what simplicity means and how Clojure's design embraces that more than in any other language I know. By then you will have embraced the flying-by-your-pants-exploratory style of programming at the REPL. And don't want to go back anymore.

It's awesome!

I've been learning it for a couple of weeks. It is humbling as an experienced dev to find something quite straightforward (parens-whining aside, Clojure is a small & simple language), yet not have a clue how to approach problem-solving with it.
Use 4Clojure for practice. Talk about humbling! You’ll struggle to write a 20 line abomination and then see some wizard’s beautiful 2 liner that does the same thing. You might spend a long while grokking it, but when you do you’ve added one or more new tools to your Clojure problem solving repertoire.
Exactly my experience. I've dipped into 4Clojure (thanks for the suggestion), and also Exercism as the mentoring is handy. I really enjoy the way you can reach solutions that are pithy without being obscure or artificially terse.

It does take me a long time to get there though. It's kicking my arse to be honest. Which is fine, as it means I'm learning - far more enlightening than frustrating.

How do you reconcile this with your day job? Or did you go on to work with Clojure full-time?
I'm not the one you asked, but personally after I learned Clojure I completely joined the Rich Hickey cult and only sought out Clojure/ClojureScript jobs or jobs where I could decide what language to use myself. I'm now on my third one. It obviously limits your pool of available jobs significantly, but I try to keep up with which companies and organisations are using Clojure in my city and so far it hasn't been an issue at all.
Thanks for sharing your story. At some point I might embark on a similar journey but with Elixir.

Side projects are always an option, I guess.

+1 for Clojure making me love programming! You likely are burned out from corporate code because of the huge compile times, complex processes, and generally a ton a of typing. This will mostly go away with Clojure. What you will be left with is significantly smaller code bases, fun with metaprogramming, and instant feedback with no waiting for compilation.
Me too. I was bored with 2 decades of C/C++/Java and didn’t like programming any more. Dabbled with Ruby, Python, Groovy and enjoyed them. Discovered Scheme, SICP, and Clojure and never looked back. Beat my head against not having my old problem solving paradigms, but it was fascinating rewiring my brain. It finally clicked and coding has been a joy ever since. The Clojure REPL rocks.
What is the best way to get started with Clojure these days? So much has changed since the early days.
The language itself is very stable. There were no breaking changes. You can pick up just any Clojure book (even old one), and probably 98% of it still be very relevant.
Good to know. I was also interested in the full environment, e.g., IDE's, package management, build chain, etc.
Yeah, then you won't be able to get a job anywhere and will puke at the sight of OOP code. Seriously, Clojure is by far my favourite language but with mouths to feed I had to put it down and get serious with JS, Python and Kotlin.
Clojure is still massively helpful to learn, even if it is not the primary language of use. It is guaranteed to make a better programmer from anyone who has never done Lisp or FP before. It is my go-to tool for prototyping - whenever I am not allowed to use Clojure, I still first write an initial prototype in it and then translate it to the target language. Even though that sounds counter-intuitive - I am far much faster compared to if I had to write directly in the target language.
I don't really get this. If you're working in the usual OOP environment (JS, Ruby, Python, Java) what use is it modelling your solution in a functional language based on immutable data structures? Isn't that like running around naked before putting on your straight-jacket ready for work?
First of all: every modern version of languages you mentioned has some basic FP primitives; second: most of the time, it's all about the logic (algorithm) and data transformations. Yes, sometimes, it feels weird, like trying to glue every single hair back onto your chin after you shaved your beard off. And of course, the approach has certain limitations - you can't use macros, you have to be careful with recursion and lazy evaluations, etc. And it only works for small problems, and I'm not talking about maintaining big projects that way.
I came here to say this, the REPL feedback loop is amazing, I think we can do more with LSP in Clojure with spec so I'm trying to build that out to attract people used to advanced type systems that would otherwise be put off

The problem is I don't have a good track record for completing projects so competitors or collaborators would be greatly appreciated

And then you get so good at clojure that repl is "just another style" and it's not much different from Python in terms of effort or thought. After all, Python has a repl too, they just call it a shell.

I have gotten burned out of my personal clojure projects same as anything.

It's just a language people. Whether speaking Japanese or English, it's just a language. Yes culture is a part of it, but it doesn't imbue the speaker with some sort of superpower. Yes other languages are fun, but both get the job done. English has the word "love", Japanese has "yugen" but both peoples seem to get by just fine.

Well Clojure is a language designed to be evaluated form by form if for example I wanted to evaluate an if statement in PHP's "REPL" then working out where that statement begins and ends is annoying compared to just sending an if expression in Clojure

In PHP once a function is defined I can't redefine it and then call it again to iteratively build that function

Just because your language has a repl doesn't mean you can get a quick feedback loop from it, in fact the more compile time constructs you have like classes and interfaces the harder it is, particularly if they're sticky with dependencies everywhere

Bret Victor's work I think really illustrates how little respect and investigation we do into feedback loops

> After all, Python has a repl too, they just call it a shell.

No. Most non-lispy (non-homoiconic) languages do not have "true" REPLs (and that includes Python as well). At best they are just that - interactive shells. To understand the distinction, one has to give a sincere heartfelt attempt to use a Lisp. Having able to evaluate any expression and sub-expression without any preceding ceremony is extremely empowering. There's a massive difference in the workflow - any experienced Lisper can attest to that. The benefits of homoiconicity are incredibly underrated in modern programming. Perhaps you just haven't used Lisp for long enough to learn how to appreciate it.

> It's just a language people.

Yes, it is. There are many different ways to express something like "number 42" - using ordinary objects like sticks, or by counting numbers out loud, or by writing the amount using words, or by applying mathematical sigma notation. And Mathematics is just a language as well. And when it comes to expressing something far less trivial than natural numbers, we have not yet discovered|invented better ways.

That all been said - Lisp syntax is not without certain disadvantages. But in many cases - the benefits outweigh the cost. That is why Lisp as an idea is still relevant, even after over six decades. And until we figure out (discover?) a better way, the ideas behind Lisp still would be very useful.

> You will feel handicapped. You will be confused.

For anyone who wants to learn Clojure (or any Lisp) from scratch, here's my advice:

Don't try to learn it by reading books. What I mean: don't try to mentally parse and analyze printed code written in Clojure. For uninitiated Clojure code may look like unreadable gibberish. If you try to understand Clojure code by merely staring at it, it may feel very exhausting.

Remember: Unlike most other languages where the code is "dead" until you compile it an run it, Clojure code is a "living thing," analyzing its "static" properties without evaluating that code makes little sense.

Get an editor/IDE that supports "structural editing." Learn basic structural editing commands - slurp, barf, transpose. Learn/set a keybinding that allows you to evaluate the expression at the cursor.

And then eval your expressions and sub-expressions. That would make it much easier to learn. And would bring joy to the experience.

How is printed clojure code from regular clojure code? Sounds like a maintenance nightmare if the code can't be understood just by reading it.
I should've probably clarified: It is difficult to grok Clojure code only in the beginning - when you are new to the language. To many beginners, Clojure code at first may not look very intuitive. That is why I'm suggesting to learn it by "breathing it" - try changing it in an editor/IDE that supports structural editing and connected to a REPL - change an expression, eval it - see the results, expand, eval again, move onto the outer/inner level expression, eval, and so on. That way you quickly get the insight and learn how the language works. And it won't take too long to learn how to comfortably read and mentally parse "static" Clojure code.

After some time it becomes clear - Lisp is not harder to read. For some people, it's the other way around - going back to languages with C-like syntax may feel awkward.

My journey to rediscovery the joy of programming started at a local FreeCodeCamp meetup group. I simply showed up every meeting and got to know some of the regular students. I helped them with problems that were simple for me, but explaining concepts creatively to them was a very interesting experience.

The students needed a project to show on their resume so I got together with them to have weekly sprints like a mock engineering team. I taught them good coding practice and slowly built up an engineering team of student engineers during my free time. It helped me rediscover engineering practices and finding open source tools that mirror what I use at work is really eye opening and made me a stronger engineer at work. I understand things with a greater depth.

I don't contribute any code, I just code review, do product planning, and conduct weekly sprints. We try to document a quick summary here: https://github.com/garageScript/c0d3-app/wiki/Sprint-H1-2020

I really enjoy teaching and have been thinking of doing something similar for a while. The biggest hurdle for me is carving out some of my “decompression” time on weekends...
I have. When I started using Rust for some real project.

I picked up a C++ codebase for a DCC app plug-in from around 2011 and started porting it to C++17.

At that time I had already started learning Rust. Three months into the project the DCC host app changed API which meant major refactoring on top of porting.

I decided: screw it – let’s rewrite it in Rust (RIIR). It has been a most amazing experience.

I haven’t felt like this since I was 14 and started learning C and later (Turbo) C++, when I was 16.

The language and community are amazing. Lots of new material that is outside of my comfort zone. Steep learning curve but with the reward of this warm feeling of learning something new almost daily.

Highly suggested.

“Writing Rust code feels very wholesome”.

–John Carmack

I couldn’t have said it better.

You're burned out. Take a break and cultivate your other interests.
Learn LISP/Scheme and lots of fundamental concepts you probably have a feel for, but in a far more profound way:

1. First watch the SICP series (https://www.youtube.com/watch?v=-J_xL4IGhJA&list=PLE18841CAB...)

2. Then work through the book (https://mitpress.mit.edu/sites/default/files/sicp/full-text/...)

If you really do the exercises (an hour here and an hour there), you can feel you brain getting wrapped around many core notions in very illuminating ways.

I've been going through SICP for a year and a half now on and off. At this point I don't feel I've been getting back all the effort I put in it.

I think it's mostly recommended by people who didn't do all the exercises, or casually browsed through it and all they were left with was the fact that you can write a programming book without mentioning assignments until halfway through or that it's more easy to write a scheme interpreter in scheme than other languages.

But the book is really dense, and you won't be left with much after trying to debug your hundreds line script meant to solve one problem.

Of course everyone comes at these things with different histories and different intrinsic interests. But I really enjoyed fundamental stuff like:

* the concept of assignment implying _time_ and messing with the substitution model.

* recursive functions that are iterative

* iterative structures that are recursive

* At the base of the base of the data abstraction in LISP is, well, nothing.

* Code as data, data as code, really strongly underlined.

* The whole LISP written in itself (as a sort of fixed point of a language that defines a language). That is really something.

* The idea of using a language to write a language that lets you express your problem.

That last one is probably obvious to most, but it was really novel to me (despite years of writing functions to compute answers).

I did. To me programming is like reading a book because you want it to (your choice of genre, no point except to read it and enjoy) vs reading a book because it is in your syllabus and you're gonna be graded on it at the end.

I think work related programming is the second kind (even if you're working for yourself) and working on projects which you make only for yourself is the first kind.

For me the trick is to not have any expectations (including any secret ones like getting github stars, upvotes, money or any deadlines). Also one thing that took the joy away before was not really programming related (which was always enjoyable) but the regret I felt sinking my time into it not doing anything"productive". Once I let go of the feeling it started becoming fun again.

Feynman described his run-in with burnout, you may find his experience interesting. I quoted a piece below, but the book is more persuasive with more intricacies of his situation.

Then I had another thought: Physics disgusts me a little bit now, but I used to enjoy doing physics. Why did I enjoy it? I used to play with it. [...] So I got this new attitude. Now that I am burned out and I’ll never accomplish anything, I’ve got this nice position at the university teaching classes which I rather enjoy, and just like I read the Arabian Nights for pleasure, I’m going to play with physics, whenever I want to, without worrying about any importance whatsoever.

[0] Surely You’re Joking, Mr. Feynman!”: Adventures of a Curious Character.

Great book and a very relevant story. Read up about Feynman and his depression after being involved in the Manhattan project, and how he overcame that by 'playing' with the wobbling plate problem.
Imagine what a mind-fuck it must have been to be on the Manhattan project! They probably wondered if they would be responsible for the end of humanity...and I guess the jury is still out on that one.
I went through something similar, a bit earlier in the process. I wasn't burned out with programming, but burned out with the particular job I was doing, which had basically been taken over by the work of being a maintainer: Reviewing other people's code, writing up community standards, trying to relieve friction in the community, etc. I had programming things on my to-do list; but whenever I organized the list by order of importance, the programming tasks were never anywhere near the top.

I reached the point where I'd sort my list, look at the things at the top and think, "I know these things are important, and it's certainly gratifying to have the influence and the authority to try to make these changes... but I kind of don't really care."

At that point, I realized that if something didn't change I was eventually going to get fed up and leave the project entirely, leaving a big hole. So, I said that I'd set aside Friday to do some "fun" programming, to keep the job interesting. (I ran this by my boss, and he was supportive.) I thought this "fun" would have to be something really different and new, but it turns out nearly any kind of programming will do; so although I mentally give myself permission to do whatever I want on those days if I need to, I often end up just writing "normal" "important" code from the top of my to-do list. Just that little bit is enough to "pay" for the rest of the week.

Joy is the source of our power as human beings. No human activity is sustainable long-term if the psychological cost of doing something outweighs the psychological benefit; and conversely, people can endure an amazing amount of hardship and toil if the activity is a source of joy. The key to sustainable work, relationships, whatever is to be looking for ways to find joy in those activities.

This is very insightful. I find that having to have a "reason" to code kind of takes away the joy of it. I.e. I start to think "is this useful?" or "is this a waste of time?". At that point all the joy is sucked out of the atmosphere and I end up doing work instead, which is very little fun most of the time.

Time you enjoy wasting is not wasted. I often need to remind myself of that.

Coincidentally John Conway talks in an interview about coming to the same conclusion. I wonder if he was inspired by Feynman?
I'm in a similar position - to the extent of largely giving up work.

I may differ in that I'm not really determined to rediscover programming. I have many interests, don't need or want much cash and am quite happy to cobble together income from other sources. But I am curious to probe the extent and permanence of the loss. Learning something new is my approach - Clojure, for the combination of lispy paradigm challenge with practicality (it suits a couple of projects I have in mind). So far I'm enjoying it more than I expected. It's refreshing.

I don't know what the results will be in my case. But learning/discovery is so close to the heart of what attracted many of us to programming, I suggest reconnecting with it as one approach.

Nothing wrong in changing your career up slightly. There are many other areas in tech that would greatly benefit from your experience without full on direct coding. Solution architect, management, devops, etc, etc.
It helps to do things you love, even if it’s not programming.

A little trial and error aids in discovery.

Initially you won’t know what it is you want to do but you’ll have some sort of curiosity about a project.

You can follow the trail and see where it leads.

Most trails are only five centimeters long. But don’t be discouraged.

When one thread disappears, another often takes its place.

Do this for long enough, protect that sacred time, and you’ll discover some passion.

I don’t doubt programming will find a way to re-emerge again in your life some day (in a pleasant, not tedious way). It encompasses so many fields.

You’ll sort of know when you’re on the right track, because what you love will be oddly peculiar and unlike many other people’s interests. You’ll have trouble explaining why you like doing it (as if it needed justification).

True interests (when properly followed) always looks a little crazy to outsiders.

20 years is a long time in anything. My first piece of advice is that nobody here knows who you are, nobody here knew you as a teenager, and nobody is going to understand what "love programming" and "don't enjoy it" actually means for you. The point is: anybody who claims that they got de-burned-out with this one trick isn't necessarily dishonest or naive, and if something in the comments here resonates, then by all means try it out. But they might be offering a good prescription for the wrong diagnosis.

This may sound dismissive or condescending and I promise it isn't my intent: have you considered speaking with an actual therapist? As a society we tend to think of therapists as something you do when you're mentally ill, but you don't just go to the dentist when you suspect you have a cavity: mental hygiene is important, and humans are universally bad at self-diagnosis, either physiological or otherwise.

In my current job I write Python, which I really don't like very much and I get burned out on Python-specific things. But I know my feelings of burnout are due to things that would be true regardless of the technical environment - and that an overall job with Python is far preferable to my previously miserable job with F#. And there's a lot of non-job stuff going on - such as the historic pandemic, and domestic stresses from being cooped up at home.

So speaking with a therapist about what's actually eating you might be quite worthwhile. If it is just burnout with programming, there really are specialists out there who might give well-informed, non-anecdotal advice. If it's something else, then having a professional suss it out means you can make better decisions about major aspects of your life. Plus, therapy is something that's easy to do over videochat. I am not recommending therapy, but I do think you should consider it.

Sorry to change topics, but are you able to expand a little on what made F# miserable. I ask as I was looking at learning it in the hopes that it would provide a positive developer experience. I would be very interested in finding out why it didn't work for someone else.
Hopefully OP will response. I read ojna's post to mean that he prefers F# over Python, but that the rest of the job around the F# programming was miserable (maybe biz, org, process, and personality stuff was bad).
I think that depends on the particular job and the person.
(sorry for the late response, I try to avoid social media of any form...)

I love F#. F# is by far my favorite programming language when it comes to writing enterprise software.

The problem with the F# job was that many on the sales team, and in upper management overall, were just bad people. They were a bad influence on my boss, the CTO and an otherwise good person. I ended up resigning over an ethics dispute.

> As a society we tend to think of therapists as something you do when you're mentally ill, but you don't just go to the dentist when you suspect you have a cavity

I started seeing a therapist about a year ago and went through a similar mental switch. I used to think of them as, like "mind doctors" to fix you when something is going wrong. But now I realize therapists are much more like personal trainers for your mind.

I'm not mentally ill or suffering any particular crisis and I still get a ton of my therapy appointments. It's basically an hour with a really smart person deeply trained in psychology who helps me make the most out of my particular brain and personality.

>>> In my current job I write Python, which I really don't like very much and I get burned out on Python-specific things. I've used Ruby for several years, and I love the language. I wish I could use it today, in my daily stack, but unfortunately, Python won in the marketplace. Syntactically, Ruby and Python are pretty much equivalent, with Ruby appealing more to me. However, Python won - no arguments. Got to go with the winner.
I've been stuck on the horns of this dilemma for a while, at least for choice of a scripting language. Ruby and Python adoption is pretty similar if you're working in web devlopment rather than data science. In London the number of Rails and Django jobs is fairly equal. Agree, though, Python is racing adhead of Ruby in general and that makes me sad.
From what I've seen, specifically-Ruby jobs tend to pay more than specifically-Python jobs (and more than specifically-Java jobs, for that matter), and while Rails and Django seem kinda balanced in some areas, in others Rails beats the tar out of Django for startup market share.
I don't know about that. Search angel.co and you'll find 36 hits for Ruby on Rails/London and 50 for Django/London. Same ratio on Indeed.co.uk/London.
There's an iceberg of Ruby jobs that don't exist in the most obvious places to search, and because other languages have gained more spotlight (including anything that even smells of ECMAScript) there are fewer people searching for Rails jobs so the number of Rails jobs is pretty well matched to the number of job-seeking Rails devs. Also, early stage startups tend to hire from people they know, not from job search sites. Finally, there are many "full stack" jobs where work on the backend means Rails.

A simplistic metric like "job listings on angel.co" (especially if you're specifically looking for Rails in the job posting title) don't tell the whole story.

That doesn't make any sense.

Use the right tool for the job. If "the winner" was all that mattered, we'd all be using Java now, and it would remain the top language forever, as long as it makes any sense at all to use -- not even requiring it to make more sense than other options.

Technological progress often evolves as a Scale Free Network[1] where the nodes with most present activities are likely to see the highest investment.

It is less of a problem for mature ecosystem and tools, but being in the "not winner" position will likely induce negative effects in the long term technological progress. (I am sure there are many counterexamples)

[1] https://en.wikipedia.org/wiki/Scale-free_network

If we assume, basically, that only The Winner Language should ever be used, we either end up with a long-term glut on technology churn (e.g. JavaScript's miserable state of instability right now, but for everything and not just JavaScript) or rapid development of novel forms of mediocrity (Java), and nobody should ever bother with Python, in which case the previous commentary still makes no sense because Python isn't "The Winner".

Sufficient investment for significant ongoing value is a matter of a threshold relevant to the particular needs served by the target technology, not of rank. As long as there's "enough" interest, it will have as much likelihood of stable or increasing value for (appropriately targeted) users as anything else.

Meanwhile, too much investment from too-big interested parties can ruin something pretty thoroughly.

Things are not as straightforwardly popularity-contest-driven as you seem to suggest.

> Things are not as straightforwardly popularity-contest-driven as you seem to suggest.

Popularity contests are not simple.

Programming is an huge field comprising many unsyncronized industries and fields. Each of them can have its own winner (or winners) and they interact in complex ways. How is beyond the point.

My claim is that having the most mindshare/resources is the simplest way to keep having the most mindshare/resources. Few technologies rely only o this to stay alive, but a relevant factor is that differently than many other (often technical) advantages this one has a positive feedback loop.

Coming back to the original topic, this might mean that even if you invest a lot in the "best" tool to solve your problems it is possible that the lack of ecosystem around it (due to other people choosing "worse" tools for the same problems) makes it a losing investment.

Of course things are not linear and even the best interpolations have only intervals of validity, yet general long-term trends and cycles exist.

If you want you can add a rate of decay to the weight of nodes in the model, but the point remain: resource distribution is typically not fair in any a priori sense; often it simply scale with the already available resources.

Example: Bitcoin is the among biggest cryptocoins mostly because it was the biggest at some point.

> Popularity contests are not simple.

I did not, in fact, say they were.

> My claim is that having the most mindshare/resources is the simplest way to keep having the most mindshare/resources.

That's largely true. Of course, having "enough" mindshare/resources is plenty, generally; one needn't necessarily have "the most". I don't see Ruby or Rails going away any time soon, even if your local area's angel.co listings show a 40% higher rate of job postings that explicitly mention Django in the headline. Development is still quite active both on, and with, the language and the framework.

> Coming back to the original topic, this might mean that even if you invest a lot in the "best" tool to solve your problems it is possible that the lack of ecosystem around it (due to other people choosing "worse" tools for the same problems) makes it a losing investment.

If your choice is Smalltalk, that might be true. If it's actually a very active community around a language and framework that provide extremely good productivity support and a lot of advanced tooling constantly attracting more innovation and heavily used in some sectors, like Ruby and Rails, it's not so true. There's pretty much guaranteed (absent government-granted monopolies) to be quite a bit of diversity in "popular enough" languages and tools for any high-traffic development sector, and "startups" definitely qualifies as such a sector of development as a field of professional work. The "winner" approach you seem to want to champion would have room for basically two options, and both of them have "Java" in the names of their most popular implementations, so arguing about the relative popularity of a Python framework in one corner of the world is irrelevant at best given your evidently intended thesis.

> Example: Bitcoin is the among biggest cryptocoins mostly because it was the biggest at some point.

This is a good point, but does not address the fact that this doesn't mean discounting Decred or Monero as a terrible choice for any useful timescale is the obvious best option.

Ruby on Rails is more popular in some areas than Django. Ruby on Rails gets a lot of time and money investment. Ruby on Rails is likely to be a good, stable choice for years to come. That example illustrates the fact that always choosing "the winner" doesn't make sense if "the winner" involves choosing the second-worst tool for your specific job out of a field of a dozen or more available tools.

I'm also not trying to sound dismissive or condescending, but it really seems weird to me that if somebody says they are have been doing something for 20 years and now they are bored of it, then they should consider seeing a therapist?

I mean, there are plenty of things I used to like that I don't anymore, should I go see a therapist every time my interests change?

I think it's more about your intent. I'm not too bothered I don't care about soccer any more, I'm not after therapy to change that.

In this case though, I see someone who badly wants to be enjoying programming, but for whatever reason they don't understand they don't. It's probably a good time to talk to someone. Usually I'd start with my girlfriend, maybe my mum, perhaps take a few weeks off and then see how I feel. If that doesn't sort it, I'd probably want to talk to a therapist.

I'm sorry but you are reducing a career to a mere interest.

Changing hobbies is not the same as trying to change what you did for a living for the past decade.

Careers are not cast in stone. Some people do change their careers if they realize that there's something else that they'd really rather be doing with their lives.

I've met an artist who became a doctor, a lawyer who became a stockbroker, a software developer who became a full-time professional musician, a professor who started a hedge fund, etc.

On the other hand if you are changing field because you are unhappy with your current situation it is relevant to ascertain that your current field is part/cause of the problem.
It's true this kind of stress and feelings are universal, but doesn't mean it's not a potentially serious psychological concern. Parents who feel extremely overwhelmed with lots of young children in the house are understandably stressed out - and yes, should be encouraged to consider therapy to help them manage.

I would recommend reading munificent's comment above about therapists as "mental trainers." I think everyone should consider seeing a therapist at least at some point in their lives. The idea that therapy is only when something is medically wrong is at best misguided and at worst dangerous.

When I suggested OP considers therapy, I didn't mean "uh oh, sounds like you're clinically depressed, DSM-V states that a loss of interest..." And the word "consider" is doing a lot of work there. OP's brain is clearly trying to tell them something, and having a knowledgeable certified professional to talk things through with is simply prudent when it comes to something as profound (and risky) as reconsidering your career.

I'd like to plug the Recurse Center (recurse.com) - it's a "writer's retreat for programmers" and helped me find a community of people who really enjoy programming. I attended 7 years ago and it's still a part of my daily life.

I also would plug !!Con (bangbangcon.com) and StarCon (starcon.io) as conferences specifically about the joy and excitement of computing. Those might be a good source of inspiration for you. (Full disclosure: I help organize !!Con).

I think one of the important things is to find people who do joyful things with computers and spend time with them, or at least follow their work.

Is it hard to get into Recurse? Is the whole program costly? (I believe you'd need to live in NYC?)
Both questions are answered on their website and their extensive handbook. If you’re seriously interested, have a read.
My theory I'm testing out right now is that if you end up doing other things that are valuable for a programmer to do, that isn't directly pr ogramming, you can still get paid and also foster other interests while your enjoyment of programming might recharge.

I mentor people, I architect and manage projects. I lean on communication skills and relationships so that the answer is easy and simple rather than complicated. I do code sometimes, but not the super heavy lifting. It may not work out great in the long term and I might have to take a break, or it might turn out that what I'm doing isn't as valuable somehow, but its working alright thus far.

The thing that drained the enjoyment out of it (and to be honest a lot of life in general) for me was being stressed at work.

When I left my full-time job (where I worked way too hard) to do consultancy I started to de-compress and it helped me enjoy life a lot more. If I won the lottery I would still be quite capable of not touching a computer for 6 months though.

Burnout often occurs because who you imagine/want yourself to be is not the same person as how you actually identify yourself to be.

It can be the feeling of "I know I can do better than this, but I'm not doing better than this right now, so I'm frustrated with myself."

There is no quick easy fix. My only suggestion to you would be to: firstly, accept that this is crap situation to be in, secondly: that it is escapable, and thirdly: realize that to escape you have to return to your roots, and rebuild from there.

When you first discovered programming, it was fun and what you created only mattered you. You started here, so go back here. Do an ancient Advent of Code (https://adventofcode.com/), or the first few Euler Problems (https://projecteuler.net/). Do not share your solutions with anyone. The most important thing is that what you do is not important to anyone except yourself. This is your baseline.