Hi,

My question certainly stems from the imposter syndrome that I am living right now for no good reason, but when looking to resolve some issues for embedded C problems, I come across a lot of post from people that have a deep understanding of the language and how a mcu works at machine code level.

When I read these posts, I do understand what the author is saying, but it really makes me feel like I should know more about what’s happening under the hood.

So my question is this : how do you rate yourself in your most used language? Do you understand the subtilities and the nuance of your language?

I know this doesn’t necessarily makes me a bad firmware dev, but damn does it makes me feel like it when I read these posts.

I get that this is a subjective question without any good responses, but I’d be interested in hearing about different experiences in the hope of reducing my imposter syndrome.

Thanks

  • magic_lobster_party@fedia.io
    link
    fedilink
    arrow-up
    3
    ·
    9 days ago

    I’m mostly working in Java now. I’m proficient to the degree that I can solve most things without looking for reference online. I think that matters most to me.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      1
      ·
      9 days ago

      It’s funny because I often have to look for the prototype of a function because I often forget all the arguments a standard C function uses, but otherwise, i feel like I am proficient enough to know where to look for, which in my case is normal because I won’t memorize all the details of how each peripheral of the mcu works.

  • JackbyDev@programming.dev
    link
    fedilink
    English
    arrow-up
    3
    arrow-down
    1
    ·
    8 days ago

    Being proficient isn’t about getting something right the first time, it’s about how easily you recognize something as wrong and knowing how to get the knowledge to fix it. Under that definition I rate myself 5/5 if I’m not trying to be humble or sorry about tiny details.

  • Ephera@lemmy.ml
    link
    fedilink
    arrow-up
    5
    ·
    9 days ago

    What helped me a lot with pushing deeper down into the language innards is to have people to explain things to.

    Last week, for example, one of our students asked what closures are.
    Explaining that was no problem, I was also able to differentiate them from function pointers, but then she asked what in Rust the traits/interfaces Fn, FnMut and FnOnce did (which are implemented by different closures).

    And yep, she struck right into a blank spot of my knowledge with that.
    I have enough of an idea of them to just fill in something and let the compiler tell me off when I did it wrong.
    Even when designing an API, I’ve worked out that you should start with an FnOnce and only progress to FnMut, then Fn and then a function pointer, as the compiler shouts at you (basically they’re more specific and more restrictive for what the implementer of the closure is allowed to do).

    But yeah, these rules of thumb just don’t suffice for an actual explanation.
    I couldn’t tell you why these different traits are necessary or what the precise differences are.
    So, we’ve been learning about them together and I have a much better understanding now.

    Even in terms of closures in general (independent of the language), where I thought I had a pretty good idea, I had the epiphany that closures have two ways of providing parameters, one for the implementer (captured out of the context) and one for the caller (parameter list).
    Obviously, I was aware of that on some level, as I had been using it plenty times, but I never had as clear of an idea of it before.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      2
      ·
      9 days ago

      I work in a small start-up where I am the only one doing what I do, so my epiphanies come from the struggles I have.

      Other people I work with often have a blank look in their eyes when I try to explain some issues or what the code does because they don’t have the skillset to comprehend what I am doing. So this isn’t a path for me (yet, hopefully we can grow enough where we need more people in my field).

      But I appreciate your experience. I will certainly think about a way to play in the innards of my language so that I can understand it better.

    • MajorHavoc@programming.dev
      link
      fedilink
      arrow-up
      1
      ·
      edit-2
      10 days ago

      Nice!

      I’m still struggling to get good at BASIC, myself.

      BASIC was my first language, and I still don’t feel like I’ve mastered it, so I still study it on some weekends.

      I take so many modern tools for granted, now. It makes my learning progress in BASIC feel slow.

      But I’m getting better at it.

  • lmaydev@lemmy.world
    link
    fedilink
    arrow-up
    2
    ·
    1 day ago

    I’ve been using c# since .net 2 which came out around the turn of the century (lol)

    I’d happily call myself an expert. I can do anything I need to and easily dive into the standard library source code or even IL when needed.

    But even then there are topics I could easily learn more on particularly the very performance focused struct features and intrinsics.

    I’ve found LLMs to be super useful when you have a very specific question about a feature. I use bing ai at work so it sources all its answers and you can dive into the articles for more detail.

    Programming is a never ending learning journey and you just have to keep going. When you get something you don’t fully understand to a deep dive there are always resources for everything.

  • hperrin@lemmy.world
    link
    fedilink
    arrow-up
    19
    ·
    10 days ago

    Knowing the footguns in your language is always useful. The more you know, the less you’ll shoot your foot.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      6
      ·
      10 days ago

      I think that one of my issue is that I’d like to be more knowledgeable to the smaller bits and bytes of C, but I don’t have the time at work to go deeper and I don’t have any free time because I have young kids.

      • arendjr@programming.dev
        link
        fedilink
        arrow-up
        4
        ·
        9 days ago

        I don’t know about your workplace, but if at all possible I would try to find time between tasks to spend on learning. If your company doesn’t have a policy where it is clear that employees have the freedom to learn during company time, try to underestimate your own velocity even more and use the time it leaves for learning.

        About 10 years ago I worked for a company where I was performing quite well. Since that meant I finished my tasks early, I could have taken on even more tasks. But I didn’t really tell our scrum master when I finished early. Instead I spent the time learning, and also refactoring code to help me become more productive. This added up, and my efficiency only increased more, until at some point I only needed one or two days to complete a week’s sprint. I didn’t waste my time, but I used it to pick up more architectural stuff on the side, while always learning on the job.

        I’ll admit that when I started this route, I already had a bunch of experience under my belt, and this may not be feasible if you have managers breathing down your neck all the time. But the point is, if you play it smart you can use company time to improve yourself and they may even appreciate you for it.

        • Croquette@sh.itjust.worksOP
          link
          fedilink
          arrow-up
          1
          ·
          9 days ago

          I work in a startup, so I’d say that almost every day, I learn something new. So I don’t really need to look in-between tasks because a lot of tasks bring new challenges.

          When I worked in corpos, my job was restricted to the same tasks and specific knowledge. Now it’s the opposite where I need to learn what I need to create a feature or fix an issue.

          I guess that lately, a lot of new things have popped up and I need to absorb a lot of information to implement the features I need. And that is probably what is triggering the imposter syndrome.

          Thanks for the insight, it is appreciated.

      • nebeker@programming.dev
        link
        fedilink
        English
        arrow-up
        2
        ·
        9 days ago

        There’s a lot to talk about from this point alone, but I’ll be brief: having gone through university courses on processor design and cutting my teeth on fighting people for a single bit in memory, I’m probably a lot more comfortable with that minutia than most; having written my first few lines of C in 10 years to demo a basic memory safety bug just an hour ago, you’re way way ahead of me.

        There are different ways to learn and gain experience and each path will train us in different skills. Then we build teams around that diversity.

        • Croquette@sh.itjust.worksOP
          link
          fedilink
          arrow-up
          2
          ·
          9 days ago

          Thanks for the insight. I guess one thing that causes my imposter syndrome is that I want to know how everything works in details.

          I agree that for other people, what I know seems like magic to them. It’s easy to look at what we don’t know, but we don’t take the time to appreciate how far we’ve come. We should do that more often.

      • MajorHavoc@programming.dev
        link
        fedilink
        arrow-up
        9
        ·
        edit-2
        10 days ago

        I don’t have any free time because I have young kids.

        That’s a healthy thing to acknowledge.

        It’s a brutal phase for professional development, hobbies, free time, sex, basic housekeeping…

        It gets better as the little ones grow.

        • Croquette@sh.itjust.worksOP
          link
          fedilink
          arrow-up
          3
          ·
          9 days ago

          At least, we know emotionally that it will get better with the second one haha, even if the day to day is rought.

          With the first one, it felt like we would never get to the other side of it. But we did and we will for the second one.

          I am eager to learn new things, so having so little free time is definitely tough. And the lack of sleep/energy makes it even harder.

          Thanks for the encouragement, it’s nice to be acknowledged by someone else that went through the same thing. We often forget that we are not alone and a lot of people got through it before us.

  • MXX53@programming.dev
    link
    fedilink
    arrow-up
    2
    ·
    9 days ago

    I think my job requires me to work in too many different areas. So although I can work in several languages and dev stacks, I am probably only a 2 or 3 or less out of 5 in all of them. However, network and server infrastructure, and cybersec/opsec I am probably more in the realm of a 4-4.5.

  • SuperFola@programming.dev
    link
    fedilink
    English
    arrow-up
    1
    ·
    9 days ago

    I’ve been using Scala professionally for 3 years. I don’t know what I’m doing most of the time because we have a ton of implicites and monads and extension methods. I just know the general idea and can get where I want by reading types.

    I’ve been creating a language for fun for nearly 6 years. I often don’t know what’s going on under the hood because it’s somewhat complex. I think this is normal for every language. You don’t have to know everything to be able to use it. You don’t have to write blog posts once a week about the language subtleties you found.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      1
      ·
      9 days ago

      The blogposts are the example I had because this is usually where I find my solutions.

      I do understand that I don’t need an in depth knowledge of everything about my language, but I sometime feel like I should know more. But again, this is the imposter syndrome talking.

      I am thinking about blogging once my kids are older and I have more time because I am grateful when someone else does and I want to contribute as well.

  • Tyfud@lemmy.world
    link
    fedilink
    English
    arrow-up
    8
    ·
    8 days ago

    I’ve been writing code for 25+ years, and in tech for 27+.

    I’m a novice at all languages still. Even though they tell me I’m a Principal Engineer.

    There’s always some new technique or way to do what I want that’s better I’m learning every day. It never stops. The expectations for what I consider to be good code just continues to climb every day.

    • Rusty Shackleford@programming.dev
      link
      fedilink
      English
      arrow-up
      1
      ·
      7 days ago

      I try to tell this to all young guns getting in.

      The amount of information due the dearth and depth of theory, practical, and abstraction I would need to where I’m comfortable enough to consider myself an expert would take a lifetime to learn.

      Hence, it’s, “Stay in the dojo, padawan!”

    • MajorHavoc@programming.dev
      link
      fedilink
      arrow-up
      2
      ·
      edit-2
      7 days ago

      After almost 12~15 years of programming in C and C++, I would give myself a solid “still don’t know enough” out of 10.

      That resonates so thoroughly.

      And while it can 100% also be the case in any tool or language, it’s somehow 300% true for C and C++.

  • danhab99@programming.dev
    link
    fedilink
    arrow-up
    2
    ·
    7 days ago

    I have no fear of implementing anything I’m asked to in typescript go rust java c# f# or nix… They’re all the same tool just kinda different in some places.

    • MajorHavoc@programming.dev
      link
      fedilink
      arrow-up
      3
      ·
      7 days ago

      But not good enough to get a job as a programmer.

      This is as weird of a time for getting hired as a programmer as we have ever had. Hang in there. Once we let AI deployment pipelines start causing production outages and shareholder bankruptcies, we will start falling over ourselves to hire human programmers again.

      • emil_98@lemmy.world
        link
        fedilink
        arrow-up
        2
        ·
        7 days ago

        Feels good to hear this. I’m also struggling to enter the industry and it’s nice to read something hopeful for a change

      • 🇰 🌀 🇱 🇦 🇳 🇦 🇰 ℹ️@yiffit.net
        link
        fedilink
        English
        arrow-up
        2
        ·
        edit-2
        7 days ago

        I mean that it’s quite a leap going from making, like, a text-based adventure in C++ or BASIC and changing/adding lines of code to someone else’s thing making mods to doing actual, professional level programming of systems I have never even fucked with for fun. Like, I can’t make the screen display an image. I don’t know how to do any sort of networking, at least from a programming standpoint (hardware and shit, no problem; I was CISCO and A+ certified at one point).

        I guess if all they need me to do is make what is essentially a database or calculator, I could do that. 🤷🏻‍♂️

        • MajorHavoc@programming.dev
          link
          fedilink
          arrow-up
          2
          ·
          edit-2
          7 days ago

          That’s the beauty of programming (and lots of skills, really) - once we master the basics, all we tend to notice is what we haven’t learned yet.

          It’s hard on our confidence, but there’s also a perverse beauty to it.

          It is a big leap, but it’s the kind of leap that gets easy when doing the job with training for dozens of hours per week.

          And it’s also a very small leap compared to the average computer user who doesn’t know why smoke shouldn’t come out of the computer case during normal operation.

          One of the cool things that AI will do is once again lower the barrier of entry for full time programmers.

          We’re on our way to finding out just how terrible AI is as a pilot, but it makes a damn fine co-pilot much of the time. And it’ll be key in welcoming in and enabling our next batch of brilliant full time programmers.

  • nik9000@programming.dev
    link
    fedilink
    arrow-up
    25
    ·
    10 days ago

    I’ve learned a lot by breaking things. By making mistakes and watching other people make mistakes. I’ve writing some blog posts that make me look real smart.

    But mostly just bang code together until it works. Run tests and perf stuff until it looks good. It’s time. I have the time to write it up. And check back on what was really happening.

    But I still mostly learn by suffering.

    • MajorHavoc@programming.dev
      link
      fedilink
      arrow-up
      12
      ·
      10 days ago

      But I still mostly learn by suffering.

      That resonates so much. Almost every time someone is deeply impressed with something I know, it brings back a painful memory of how I learned it.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      3
      ·
      10 days ago

      I really like brain twisters. It can get frustrating at times, but it’s the most fun out of the profession to me.

  • farcaller@fstab.sh
    link
    fedilink
    arrow-up
    2
    ·
    9 days ago

    I don’t think your question relates to the language as much as to the platform. The language of choice is somewhat irrelevant and what you care about is what actually happens under the hood.

    For the likes of java and go you want to have some understanding of what runtime does for the memory allocations and how their GCs work. For python you sometimes end up in the spots where you need to understand what limitations the GIL imposes (even more important now that they are trying to get rid of it). When you run C (or C++ or Rust) on the embedded hardware it really helps to understand what exactly bit flipping does in specific registers and what DMA means for how you write your code.

    You don’t really have to know it all. You can absolutely write code without caring about anything of that and I know plenty software engineers that do. Some people write amazing functional things in java without ever questioning what it does to the machines and what resources you need to run it.

    If you start questioning it, that will only expand your understanding. It’s not a lateral move from e.g. C to Rust where you need to learn a lot to write your code in a memory-safe way, it’s a movement deeper into the stack and what you learn there will be applicable to any language you use for this stack.

    Answering your question: I always feel bad about not understanding some low-level concept. I have stacks of MCU reference docs lying around, printed, highlighted; I have archives with sample code, and hand-annotated CMSIS reversing notes. Embedded world is hard because you can’t just know C and be done with it. You have to know the hardware, too.

    Here’s my advice for you. Make notes of things that you learn from people smarter than you. Create a web of those notes and see where your gaps are. Then, work on learning something in those gaps in particular and see if you can make a blog post or something of your own. When you share what you learn you become one of those people with deep understanding that others look up to. There’s always someone struggling with something that you either know or know how to figure it out.

    • Croquette@sh.itjust.worksOP
      link
      fedilink
      arrow-up
      2
      ·
      9 days ago

      What I like about embedded is that it’s between software and hardware, where you have to know both to a certain extent. It kinda feels like being a mad scientist bringing a monster to life. Seeing that my code makes physical actions (lighting a LED or controlling a motor) never seems to get old, even when trivial.

      I am confronted everyday about the things I don’t know because I work in a startup and I am the only one that does what I do. Any issue that I have tells me what I need to learn to fix the issue.

      You are right that for a lot of people, what I do seems like magic and we often forget the extent of our knowledge because it has become innate.

      Thanks for the insight, I appreciate it.