this post was submitted on 12 Oct 2024
74 points (96.2% liked)

Programming

17260 readers
88 users here now

Welcome to the main community in programming.dev! Feel free to post anything relating to programming here!

Cross posting is strongly encouraged in the instance. If you feel your post or another person's post makes sense in another community cross post into it.

Hope you enjoy the instance!

Rules

Rules

  • Follow the programming.dev instance rules
  • Keep content related to programming in some way
  • If you're posting long videos try to add in some form of tldr for those who don't want to watch videos

Wormhole

Follow the wormhole through a path of communities [email protected]



founded 1 year ago
MODERATORS
 

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

(page 2) 33 comments
sorted by: hot top controversial new old
[–] [email protected] 5 points 1 week ago* (last edited 1 week ago) (1 children)

I am very proficient in my primary language, C#.

Writing more context out feels like boasting, so I think I will skip that and go to a summation/conclusion directly.

Knowledge and expertise comes from more than the language. Which you hinted at. The language is only our interface. How is the language represented, how will it transform the code, how will it be run. There's a lot of depth in there - much more than there is in the language itself.

I learned a lot, through my own studies and reading, studying, projects, and experience. I'm a strong systematic thinker. It all helps me in interpreting and thinking about wide- and depth- context and concerns. I also think my strengths come at the cost of other things, at least in my particular case.

You're not alone. Most developers do not have the depth or wide knowledge. And most [consequently] struggle to or are oblivious to many concerns and opportunities, and to intuitively or quickly understand and follow such information.

Which does not necessarily mean they're not productive or useful.

load more comments (1 replies)
[–] [email protected] 2 points 1 week ago (1 children)

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.

load more comments (1 replies)
[–] [email protected] -2 points 1 week ago* (last edited 1 week ago)

Even the creators of languages don't know their own languages 100%. I wouldn't even call them the limit. So, I'm good enough in my main language that a lot of code doesn't surprise me. And I try very hard to write code that others can understand as well when in a team.

Anti Commercial-AI license

[–] [email protected] 2 points 1 week ago

I'd say average.

In every project and in every team, I end up being strong because I fix the hard stuff. I debug better and I deliver mostly bug free code. My code is more efficient and performant than my coworkers most of the time.

That's gotta count for something.

Imposter syndrome is good for me. Keeps me learning.

[–] [email protected] 5 points 1 week ago* (last edited 1 week ago) (1 children)

A solid 5.

I'm happy with it too. They still pay me so I must be doing something right. Almost two decades now.

[–] [email protected] 4 points 1 week ago

5 years professionally and I can find jobs, so yeah I must do something decent. But that imposter syndrome is strong these las weeks

[–] [email protected] 9 points 1 week ago (4 children)

A one out of ten. I consider myself the world's second worst programmer.

[–] [email protected] 2 points 1 week ago (3 children)
[–] [email protected] 7 points 1 week ago

Odds are the worst one is still using Twitter.

load more comments (2 replies)
[–] [email protected] 1 points 1 week ago

Imposter syndrome is strong

load more comments (2 replies)
[–] [email protected] 25 points 1 week ago (2 children)

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.

[–] [email protected] 12 points 1 week 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.

[–] [email protected] 3 points 1 week ago

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

[–] [email protected] 5 points 1 week ago (1 children)

I got pretty good with BASIC back in 1983.

[–] [email protected] 1 points 1 week ago* (last edited 1 week 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.

[–] [email protected] 16 points 1 week ago

how do you rate yourself in your most used language?

I know things that no human should have to carry the knowledge of

Do you understand the subtilities and the nuance of your language?

My soul is scarred by the nuanced minutia of many an RFC.

in the hope of reducing my imposter syndrome.

There's but two types in software - those who have lived to see too much...and those who haven't...yet.

[–] [email protected] 13 points 1 week ago* (last edited 1 week ago) (2 children)

In C in particular, you have to be very cognizant of the tricky ways the language can screw you with UB. You might want to try some verification tools like Frama-C, use UB sanitizers, enable all the compiler warnings and traps that you can, etc. Other than that, I think using too many obscure features of a language is an antipattern. Just stick with the idioms that you see in other code. Take reviewer comments on board, and write lots of code so you come to feel fluent.

Added: the MISRA C guidelines for embedded C tell you to stay with a relatively safe subset of the language. They are mostly wise, so you might want to use them.

Added: is your issue with C or with machine code? If you're programming small MCUs, then yes, you should develop some familiarity with machine code and hardware level programming. That may also help you get more comfortable with C.

[–] [email protected] 2 points 1 week ago (1 children)

My issue is with the imposter syndrome i'd say.

I don't know asm on the tip of the fingers because today's mcu are pretty full of features that makes it not useful most of the time, but if I need to whip up something in asm for whatever reason, I know the basics and how to search for documentation to help me.

I try to follow MISRA C guidelines because it's pretty easy to follow and it gives tool to reduce mistakes.

I have enough experience to avoid many common pitfalls such as overflows, but for whatever reason, it always feel like I don't know enough when I come across a tutorial or a post with a deep dive in a specific part of an embedded project or on the C language.

When I read these tutorials/posts, I understand what is being done, but I could not come to these conclusions myself, if that makes sense.

[–] [email protected] 2 points 1 week ago* (last edited 1 week ago) (2 children)

What are you working on and what kind of organization? Are you working with someone more senior? You could ask him or her for an assessment of where you should work on strengthening up.

You are in the right mindset if you are worried. Many C programmers greatly overestimate their ability to write bug-free or even valid (UB-free) code.

The AVR MCUs are pretty simple compared with 32 bit MCUs, so are good for asm coding.

Otherwise it's a matter of coding til it's reflexive.

Philip Koopman has written a book on MCU programming that sounds good. I haven't seen it yet but someday. You might look for it: https://betterembsw.blogspot.com/2021/02/better-embedded-system-software-e-book.html?m=1

John Regehr's blog is also good.

load more comments (2 replies)
[–] [email protected] 5 points 1 week ago

Yeah, but they make me MISRAble.

[–] [email protected] 19 points 1 week ago (1 children)

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

[–] [email protected] 6 points 1 week ago (4 children)

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.

[–] [email protected] 4 points 1 week ago (1 children)

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.

load more comments (1 replies)
[–] [email protected] 9 points 1 week ago* (last edited 1 week ago) (1 children)

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.

load more comments (1 replies)
load more comments (2 replies)
[–] [email protected] 9 points 1 week ago* (last edited 1 week ago) (2 children)

Better than many, mediocre.

With my coworkers I've got a strange ability to pick up any language that tastes like c, and get stuff done. I'm sure I've confused our c# guys when I make a change to their code and ask for a code review, because I'll chase down quality of life improvements for myself. (Generally, I will make the change and ask if I have any unintended side effects, because in an MCU, I know what all my side effects are, multi threaded application?, not at all)

Edit: coming from a firmware view, I've made enough mistakes to realize when order of operations will stab me, when a branch is bad because that pipeline hit will hurt, and I still get & vs && wrong more often than I would like to admit.

[–] [email protected] 2 points 1 week ago

I think I'll never not make & &&, | || or = == operators mistakes. It's so easy to go over it fast and not notice the mistakes.

I like developing MCU firmwares because there is limited amout of resources and you usually have direct control of what is running when.

I feel the better than many, but mediocre in my soul. I mean, I get paid to code, so I certainly have a good enough knowledge to do so. But I have the tendancy to undersell myself.

[–] [email protected] 3 points 1 week ago

I just have to say "tastes like c" is a visceral way to say it. I approve.

[–] [email protected] 4 points 1 week ago (2 children)

The more I learn about my language the less I think it matters. Maybe in embedded C you can’t just leave everything to the compiler though.

[–] [email protected] 1 points 1 week ago

It's a strong typed language with a minimal set of guard rails, so there is certainly some considerations to take into account, but the compiler are pretty good and give more leeway to the dev.

[–] [email protected] 1 points 1 week ago

Not every thing, but still most things by far.

[–] [email protected] 9 points 1 week ago

If you step in enough shit you eventually learn to realise when you are about to step in it again. I think the most knowledgeable people are those that have failed the most and found something helpful along the way, seems you are well on your journey so just keep steeping. At some point the abstractions you have control over become unreliable until you understand how they interact with lower level systems and the balance of control comes back because you know know the circumstances in which these abstractions work in your favour.

[–] [email protected] 70 points 1 week ago (1 children)

With about 12 years in my primary language I'd say my expertise is expressed in knowing exactly what to Google..

[–] [email protected] 27 points 1 week ago

This is probably the true highest level of expertise you'll get out of most professional coders.

It takes a real monk level of confinement to understanding the language to break out of being proficient in looking shit up and start being proficient in being the person that writes the shit people are looking up.

load more comments
view more: ‹ prev next ›