Hacker Newsnew | past | comments | ask | show | jobs | submit | carterza's commentslogin

I started programming in Nim around 2015 and still write code in it from time to time. At this point I would have a tough time suggesting the language to anyone for much. While you can certainly accomplish almost any programming task with Nim, how much frustration you will encounter fighting the compiler and broken / under-specified language features and semantics might be a turn-off. There are other major warts with Nim, which I'll outline briefly below.

1) Nim's leadership is awful and has always been historically. Those in charge of managing the community are more interested in their personal reputation's and resumes than they are actually contributing working software to the language's ecosystem. Even the BDFL treats Nim like their own personal compiler R&D playground. There are so many broken features in Nim which never see the light of day or never get removed.

2) Continuing to expand on the point above, the Nim compiler has become insanely difficult to work on. As more and more half-baked features have been added to the language, the situation has only worsened. There are many would-be contributors who have come into the community only to leave completely frustrated or appalled by the lack of interest in improving the situation from those leading the community.

3) The development path is driven by leadership and not the community, and leadership has no plan. This was extremely evident last year when Araq and others were asked for a roadmap for Nim and they admitted to not having one, and basically wrote one up in a forum thread. Araq and dom96 and a few others, especially those who have been brave enough to actually deploy Nim code in production (looking at you status.im) tend to dictate what gets worked on or fixed. There is no coordination amongst folks working on initiatives. You can look at the `fusion` project, which was started by Nim's leadership, drew contributors in, and then was abandoned by leadership while maintainers were left on the hook to keep things afloat until they too dumped the project.

Things have gotten so bad, that a hard fork has been in development since last year, and many of the more senior community members or those who have been around for a bit have migrated there: https://github.com/nim-works/nimskull

Nim's community now consists of mostly new members or folks who weren't really active in it before, but maybe used Nim. Of course, the leadership remains in place, but there are only a handful of folks remaining that have been around for more than a year or two. Mostly those who bit the bullet on using Nim in production or built large projects with Nim and are stuck maintaining them.

My advice would be to look elsewhere.


> many of the more senior community members or those who have been around for a bit have migrated there

It's true that compiler developers like krux, Clyybber, saem migrated to nimskull, I don't disagree.

> but there are only a handful of folks remaining that have been around for more than a year or two

But I totally disagree with your false statements about "senior" community members (those who don't do compiler development) migrating to nimskull - this is not true at all. There are a lot of "senior" people left in the Nim community.

And again, nimskull isn't a "silver bullet" either. It has the flexibility to change major things in the language just because it's a hard fork and almost no one (except people who develop it) uses it for real projects, whereas Nim has an actual userbase that doesn't want their code to be broken, especially considering the fact that nimskull has already removed a lot of the stdlib libraries, especially async (which there is no alternative to in Nimskull).


Most of the "senior" community members who have migrated to NimSkull are those who liked to work on the compiler. The ones who remains using Nim are those who like to write libraries and projects. I've yet to see anyone create a library or project with NimSkull, although that might be because I'm not too exposed to it. I would love to be proven wrong, but for the time being NimSkull looks like a good idea if they can pull it off. But currently it looks like ripping of the band-aid to get to a better place and currently it's still in the burning and stinging phase before things (hopefully) gets better.


I apologize if my sentiment came off as Nimskull is a realistic alternative for those who are frustrated with Nim - it certainly is not, and I think your description of the state of the project is spot on PMunch!


I guess your definition of senior and mine vary. I'd consider senior members anyone willing to work on the compiler, as they are the members with the potential to move the language forward and out of the mess it currently finds itself in.

Are there experienced programmers in the Nim community, sure? Are they able to fix Nim with Nim's leadership in place? Doubtful in my mind based on history.

Also, I apologize if it seemed like I was evangelizing Nimskull or suggesting folks switch to it. I agree it is in no shape to serve a replacement for Nim presently, and may not ever be.


Nothing here is untrue, but from my perspective it's overstated. I don't use discord, but I visit the forum daily, follow most of the RFCs, and spend a lot of time coding in Nim (https://github.com/dsrw/enu). I really like Nim, mostly like its community, and think many more people should be using it.

I'm sure fusion could have been handled better, and for 2021 the roadmap was a bit hazy, but I can't think of any other big missteps. Araq, dom, PMunch, and other senior folks are in the forms helping people and answering questions every day, and my interactions with all of them has been very positive. The big post 1.0 feature was arc/orc, and that was very well communicated. Bugs are being fixed, useful new features are being added, and future plans are being discussed in the open.

And Nim itself is great. The "if it compiles, it works" factor is high, yet I almost never feel like the compiler is fighting me. Simple things are simple (I'm teaching it to a group of 12 year olds), it's incredibly flexible, it's fast, and it's suitable for almost any sort of problem. There's nothing else like it, and I expect I'd continue using it for at least a decade even if it switched into maintenance mode tomorrow. I think it will take at least that long for something better to come along.


The compiler works until you stress the type system or try to take advantage of features that are experimental and then stay that way forever. How many iterations of concepts have we been through at this point? What happened to hot code reloading? Why do we have all these legacy GCs?

The point is the compiler has more and more cruft that makes it increasingly more complex and increasingly unreliable. It also makes it so that bugs are harder and harder to fix. Not to mention that it's basically impossible to track what is going on with the language at any given point in time because there is no roadmap or updated status. It also doesn't help that certain folks like to create ten GitHub issues and RFCs for every perceived slight in the language.

Once again, the problem boils down to a complete lack of leadership or interest in running the show - and instead of empowering the community to make that happen, leadership sits back and acts like everything is great and perfect and pats themselves on the back. When someone complains that it is not, leadership finds a way to defend itself and turn sentiment against the person complaining. It happens over and over again and it's why Nim isn't a success story like languages that actually have empowered communities and leaders that are interested in leading and not just collecting book revenues / making .io games, etc... while actively gatekeeping those who would like to get involved in making things better.


its true that leadership does nothing and development is stuck, but even in this state nim is probably enough for most people.

> how much frustration you will encounter fighting the compiler and broken / under-specified language features and semantics might be a turn-off.

unless you limittest generics, most people wont even encounter this.

> My advice would be to look elsewhere.

that would imply that there is a better alternative


> unless you limittest generics, most people wont even encounter this.

I don't think my totally normal usage of generics for type safety could be called "stretching the limits." My usage of generics includes using a parameter [V] for OpenGL meshes to introduce type safety with the vertex type. I'm pretty sure that's perfectly normal?

Recently one of my friends tried compiling my project - pan[1] on Windows, and for whatever reason - it doesn't work! stating that it "cannot instantiate 'V'", whatever that means. I've had this error annoy me many times before, but I have no clue what triggers it or how to reproduce it reliably. Call this a 'stable implementation.'

[1]: https://github.com/liquidev/pan [2]: https://github.com/liquidev/aglet


I've run into the "cannot instantiate 'V'" somewhat regularly. Generally it means the compiler doesn't have enough info and defaults to trying to use `V` as a concrete type.

Generally it's not usually an issue with Nim's generics itself, but rather bad error message. Definitely an area for improvement IMHO. Though having used a fair bit of C++ templates over the years, I still find the Nim errors much more tractable after a bit of experience.

There _are_ a few broken limits of Nim's generics, but they are things pushing the type system to a limit.


I'm not sure there is one - but I guess a language where you're not constantly dealing with horrible error message, an under-specified and broken implementation and a shitty stdlib - might be better, even if it doesn't have some of the nicer frills of Nim.


Ye gods and little fishes, is there a new-ish language suitable for application programming, which has a more-or-less feature-complete design and implementation, and where there's no petty drama going on every other day? And which, to boot, lets you get a job done without requiring/strongly suggesting that you become a part of their vibrant community?

A have a sinking feeling such language exists and is called "C".


You may be right... I wouldn't call Nim's community vibrant though.


You know why I’m using the term, though. It’s a battering-ram-of-a-tongue-in-the-cheek. Each time I’m encouraged to engage in a community, it’s called vibrant for some reason.

It’s like the “incredible journey” term for companies that get swallowed whole by other companies, leaving their customers to dry.


This matches my experience with Nim community and it's toxic leadership. The amount of petty drama the community leaders get involved with is unbelievable. Spending a few weeks on their Discord, and observing how the leadership interacts with new/opposing ideas is enough to get a clear picture. It doesn't inspire trust.

Contrast this to, say, Zig, their road-maps and community structure is light years ahead.


What the heck man? This doesn't match my experience at all. And I can't find your username on neither matrix nor discord. Did you just found a chance for a sucker punch and took it? I bet Zig is the wonder land.


It does fit my experience and you'll find me as a lurker in the discord. Though I'm not surprised you haven't noticed this. The mod in question is a master in gaslighting. I'm not sure I would have noticed if I didn't have personal experience with this level of manipulation.

It's not a coincidence you see the same name pop up, every time someone gets bullied out of the discord.


But those who got banned didn't they ignored the warnings, continued flaming and insulted other users? Will you pretend that people who behave themselves get banned?


Oh, they absolutely ignored warnings and used rude insults. And if you were in their situation, you would have too.

Have you ever dealt with someone that constantly lies and misrepresents your opinions to make you look like a villain? Have ever gotten frustrated, because the person you're arguing with is constantly shifting the goalpost to their benefit? Have you ever said something needlessly rude out of frustration? How would YOU react, if after dealing with all this disingenuous bs, YOU get told to watch your tone or you get banned for being toxic?

The justifications after a ban always make logical sense, true. But if you read through the logs with even a little bit of empathy, it becomes clear very quickly who the toxic person in those interactions is.

Edit: I'm not talking about a specific person getting banned. This happened numerous times, including newcomers.


I agree to some extend and that's why I believe bans should be lifted after 30minutes when people have calmed down. But on the other hand one should watch how he behaves and not blaming it on others.


dom96 simply needs to go - they are nothing but self-serving and they cause more damage to the Nim community than any other member by far.

I'm not even including the horrible software they've authored and cargo culted into the language's ecosystem and tooling. That should be enough of an offense to be removed from any decision-making role.


I haven't seen this at all, and am actually baffled that you're talking about dom. My experience of him has been the literal opposite.

He didn't cargo cult his software into the ecosystem. He made the ecosystem. Nimble is the package manager because there was no package manager until dom wrote one. Jester is the default web framework because it was first, and despite its age it's still pretty good. Same for choosenim. And asyncdispatch. And all of the other tools/libraries that he wrote.

Obviously writing some early software doesn't give him a free pass. I could understand the attitude if he was a jerk, but I've never seen him be anything but helpful.


I mean, I have experienced first-hand, dom96 being a jerk directly to me after I spent months of effort building something for the community. I'm not the only one either. If it was just dom96 being a jerk my criticisms might not hold water, but the problem is far deeper than that.

Try to advocate for replacing any of dom's tools / software packages and see what happens. Try to advocate for taking Nim in a direction counter to what dom perceives as the right one, even though they no longer contribute to the language anymore besides telling people to fix their broken software they're no longer willing to maintain, or to throw their weight around in RFCs / IRC.


You're proving my point. Any criticism must be an attack (e.g. suckerpunch in this case) and must be met with heckling and banning. Zig is no wonderland, but I haven't experienced things like the creator of the language personally engaging in almost every drama and banning community members.


In my experience the creator of the language (Araq) almost never engages in drama stuff. Are you perhaps mistaking him with someone else?


To be fair Araq is sometimes a bit brusk. But in my experience he's generally handled flame trolls pretty well.


Why am I not allowed to be suspicious, with a new account doing advertising for Zig while creating controversy? How about you provide more details, instead of throwing accusations?


> advertising for Zig

This is the type of insecurity and paranoia one can expect to find when hanging out in Nim discord.


Do I know you? No. Are you extremely hostile? Yes. What did you expect?


I'd also like to see a section for junior devs, and what they need to bring to the table.

Another great section would be how to identify a pairing that is less than ideal / problematic.


I find pairing with anyone that is significantly outside the range of your competency level, to be extremely frustrating.

You can have a junior dev, and hand hold, but it also requires effort on the part of the junior dev / a desire to learn and grow. Without that, the exercise is futile.

IMO - pair programming is over-hyped. I often find that I produce better, more reliable code, with the more space and more time I am given. I agree that pair-programming can rock in certain circumstances - but you need developers that have a certain level of synergy, you can't force it.


> You can have a junior dev, and hand hold, but it also requires effort on the part of the junior dev / a desire to learn and grow. Without that, the exercise is futile.

If someone's not interested in learning or growing, I don't see how pairing or not pairing makes a difference.


It is completely driven by senior developer. Many students find such pedagogy demotivating. They are not getting tasks they could solve autonomously and independently, every their step is watched as they are doing it. So, they don't even have chance to make mistake, realize mistake by themselves and then fix it. Imagine college classes done that way - everyone would rightfully complain.

Motivation and desire to learn are partly function of personality and partly function of environment.


> Imagine college classes done that way - everyone would rightfully complain.

The tutorial method is thousands of years old, actually. I suspect that if one-on-one education was economically feasible it would be the model chosen almost every time.

Having paired with people who don't know what "if" and "for" mean in a software context clear through to individuals who've been in software for longer than I've been alive, I can only say that it works more often than not.

I often hear that pairing would be terrible at this, pairing must be dreadful for that, pairing wouldn't work for the other thing. What these have in common is that they are rejections based on mental simulation of events.

But ... I've actually paired. For years. It doesn't work for everyone but it still works for most people, so long as they learn it from an experienced pair.

It is frustrating to see a thing work, over and over, then be told you must be wrong, it can't possibly work.


> It is completely driven by senior developer.

It's also driven by the company. Sometimes companies make decisions that really impact employee loyalty.


Its a colossal waste of the experienced person's time


You learn someone isn't interested in learning or growing much quicker, which itself is very important information.


Having been on the other side of this, yes, it really can be.

On the other hand, in a review-driven situation, you're back where you started, multiplied by a slow feedback cycle and competing stimuli.


Another issue with pair programming - the assumption that the benefits which are potentially produced by pairing, are often baked into estimations regarding quality of work and / or deadlines.

The current product I work on has had a team of - count em - two developers for the past year. I'm the one that is full-stack, so I get to help the less-experienced developer work on our frontend, while I have minimal time to work on the backend solo (for the most part).

My pair programmer partner, also has no interest in learning the new dev-sec-ops our company is pushing - so I get to also solo all of that work.

It's an extremely frustrating / soul-crushing scenario to be in. It's basically punishment for exhibiting competence and willingness.

It's a situation I'm hopefully out of in the next month.


Then - he randomly wants to chime in with tangentially related questions - it's basically all of the pitfalls described in the - working with a junior dev section of the OP's article - except I've tried every one of the tactics described therein, and at some point you have to question whether the junior dev really wants to be a dev or grow at all...


I'm not presently going through exactly what you went through - but I can relate on many levels.

I've been on and off anti-depressants since I was sixteen, and I'm 33 now. My self-confidence has been basically destroyed, and I've kind of been just a shell of a human being ever since middle school. I've never figured myself out, and I've never felt like I've had time to, or the space and energy.

I've been in and out of therapy, I've been to rehab, and I've seen lots of professionals - psychiatrists and therapists.

My current psychiatrist is helping me a lot - but it also seems like it's two steps forward, and three backwards. During the spring, I gained a lot of confidence, and felt like I was back on track, and it only took one thing going haywire in my plans, for everything to once again fall off the rails.

Like you - I finally broke down to my parents (who have been amazingly supportive over the years) - and this isn't the first time I've broken down in front of them - but hopefully it's the last.

I've decided that the career path I've sought for myself, which is the line of work they both worked in, isn't for me.

My main goal right now, which I'm going to need their help with (because at this point accomplishing basic tasks like opening my email / checking my physical mail - are terrifying to me), is to sell the house I purchased several years ago. This thing has been a boat anchor, and has helped keep me stuck by requiring a certain level of monthly income.

After that, I hope to quit my job and set out across the country to do some soul searching. Hopefully via the house sale and savings I've accrued, I can keep myself afloat for a while, while I pursue new opportunities.

My goal is to enter a new industry, that is arguably more rigorous than the one I'm leaving, but I feel like my current position has contributed quite a bit to my deterioration in mental health, and that it's not what I love - or even want - to do.

Ultimately, I keep myself going by remembering the alternative is not an option. I try to think that things will get better, but it's difficult at times. The one thing I can always rely on fortunately (and this isn't true for many), is family and my close friends. Networking is very important, and so is remembering that everyone, including you and me, deserves to be happy.


Best of luck to you as you make these changes.

Your journey is yours alone to make, so don’t take this advice but rather an anecdote.

When I was able to better understand what I valued in life (which is also constantly changing) I was able to find a lot more peace in my day to day life. I do what I value. I avoid what I do not. Much of what I value comes with challenges, pain, and difficulty, but because I value it the friction proves beneficial in the long wrong. I eschew things I don’t value (social media), but constantly reevaluate and challenge myself.

Good luck. I hope you find what you’re seeking.


Thank you!

I really do value that feedback. I have also stopped using almost all forms of social media. I can't drop twitter - but that is because I value a lot of the content I read there (mostly related to game development).

I've also learned that I need to focus on what is important to my health, and less, on what is important to others.

These are hard lessons for some individuals to learn. It's amusing - because very much of my behavior is self-centered.

I think the key lesson I've learned throughout my continual growing process, is that thoughtless compassion and service to others, grants you the ability to also be compassionate towards yourself.

Living in your problems, hating life, focusing on negatives all the time, wraps your head around your own negativity and dissatisfaction with life.

It's a fine balance that needs to be maintained, and it's easy to slip up in that regard, but I think it's also critical in healing and recovery.

And even then - living this and thinking it, are two totally different things.


It's a perfectly valid comparison though.

Your comment on the other hand...


And, with every single of your comments being related to the Nim language, I guess you are objective.


Compiles... compiles.

Edit -

Sorry - that was rude. I should have elaborated.

Transpiling is a specific type of compilation that involves two languages with a similar level of abstraction.

Compilation involves languages with different levels of abstraction.

Nim offers a much higher-level abstraction than C, thus you could consider the process of converting Nim to C, a compilation process rather than a transpilation process.


This comes up everytime i post about this and most people agree with me that transpile means convert to a different source language. It is definitely a common use, but I realize it is a gray area.

Edit: Compiling def isn't wrong, but Transpiling is more descriptive to me as it indicates you're not going to assembly or machine language or something like that.


Compiling is the correct terminology here. Nim transpiles to JavaScript, but it compiles to C and C++. You don't say that Rust transpiles to LLVM IR, do you?


Mad respect for you Dom, but why would going from Nim -> JS be Transpiling and Nim-> C++ be compiling? Both go from a high level Lang to another high level Lang.


I don't consider C/C++ high-level.


I would normally agree with you, but that seems subjective.


It is indeed a little subjective and changes with time. This Wikipedia article explains it fairly well I think: https://en.wikipedia.org/wiki/High-level_programming_languag...


I would say compiles is a more general form of transpiles. Transpiling meaning it compiles into a higher level form i.e. c, C++, JavaScript, and compile meaning it compiles into a more lower level form i.e assembly, bytecode, etc?

That's just how I look at it anyway.


I've written quite a few personal projects in Nim, and I love programming in it. Nim is garbage-collected and the GC is not a stop the world GC, so the language is well-suited for game-development.

Its standard library is improving with each release, and is already equivalent to what you expect from most modern programming languages. It contains flaws and inconsistencies, but it is being worked on and stabilized for a 1.0 release of the language. The ecosystem is small - but growing.

Some of the great things about Nim -

1) Ability to interface with C/C++/Obj-C/JS

2) Can compile to any of ^

3) Meta-programming

4) Python like syntax

5) Small binaries

6) Can compile to WASM via emscripten

I've built AWS lambda jobs with Nim by interfacing with Python, as prototypes for work, but I've never been able to leverage the language in production. I really only use it professionally to replace personal shell scripts or other tasks I've previously automated.

That said - Nim has a bright future - it needs to mature and hit 1.0 and it could really use some more interest as well as sponsorship.

Github - https://github.com/zacharycarter


5) Small binaries

That part is amazing. I personally do not have a real use case to exploit it [1], just find it neat from an engineering viewpoint...

I guess, it has an aggressive dead code removal process, compared to other - nowadays hot - compiled languages (Go, Haskell, Rust, D, Crystal). In those languages if you use a small part of their standard library, you usually get large chunks of it linked in statically (+ runtime if there is such)...

(Once I've tried LTO with one of my Rust project: it increased the build time tremendously but in the end it managed to shave off only 30KB from my several MB binary...)

[1] If I would try micro controller programming ever, I probably would give Nim a shot because of this...


I've just tried now some Rosetta code examples. Most of it had to be modified a bit to get compiled with this Nim version although. (adding types, change case of type names)

Used -d:release --opt:size, then strip, Ubuntu 16.04 64 bit. The binary sizes:

GTK2 example code: http://rosettacode.org/wiki/GUI_enabling/disabling_of_contro... - 35k

http client: http://rosettacode.org/wiki/Ordered_words#Nim - 72k

http server: http://rosettacode.org/wiki/Hello_world/Web_server#Nim - 121k

The binaries are dynamically linked only to the common standard C prog. dependencies on Linux: linux-vdso.so.1, libc.so.6, ld-linux-x86-64.so.2 (Except for the gtk2 example of course, which uses libdl to to pull in a large bunch of additional gtk dependencies too...)


how does it compile to wasm if it has a GC?


Probably it builds the GC into the WebAssembly output.


Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: