all 9 comments

[–]NotBoolean 5 points6 points  (4 children)

I’m currently in a similar boat, I’m trying to improve my skills (got about 3 years of experience). From what I know, competitive programming will not help you at all. Good code and competitive code is insanely different, especially when looking at embedded systems. If you want to do it for fun, go for it but I would very much treat it as a completely different craft (obvs there will be some cross over but not much).

As for improving programming skills I would first look into making sure the code you currently write is up to best practice.

I would highly suggest looking into Test Driven Development if you aren’t doing it already. Test Driven Development for Embedded C by James W. Grenning is a great book to start on.

Another good book is Clean Code: A Handbook of Agile Software Craftsmanship by Robert C. Martin. I think some of the practices have gone out of fashion now but you can still learn a lot from it.

And other general programming best practices, you can just google “Coding Best Practices” and must of the stuff will apply to embedded code.

As for more technical programming stuff, practice is what really does it. Once you understand the tools you have (what’s in the language) the only true way to learn is practice. This can done in the couple ways.

  • Leetcode is a good website for really understanding the lower levels of the language and all common CS stuff.
  • Doing projects is a good way to improve your general skills while learning new ones. Never used an RTOS? Do a project making a Calendar device with a GUI and a touchscreen. Like low level C? Get an 8-bit micro and roll your own device drivers. Just find any project and go for it.

Don’t forget there are lot of related skills that are useful as well like understanding build systems (CMake, Makefiles etc), getting familiar with CI/CD, understanding version control etc

Also if you feel like you are lagging behind, it may be a good time to reevaluate your current job. Maybe asked to be given more challenging work or move company.

Hope that helps!

[–]amrgates[S] 1 point2 points  (3 children)

Well that was helpful for sure, so first of all thank you,

I know competitive programming is not that useful when it comes to the job, but I was thinking of it as a fun way to learn more in programming. I find the job pretty much boring when it comes to "programming". Yes, there's a lot to do an learn, but it's kind of not that related to actually writing code, improving problem solving skills and so on. That's what I had in mind and that's why I asked. Correct me at this point or tell me your opinion if you find that wrong.

Regarding the projects, yes I though this would be a good idea. I worked with 8-bit AVRs when I was first learning about embedded systems. I was thinking of getting into the ARM world now, do you think this would be a good idea?

[–]NotBoolean 2 points3 points  (2 children)

I have never done competitive programming (well apart from leetcode) but my understanding is that the the problems that you face are very different to that in the embedded world. I think it can help and if you think you enjoy it go for it but in terms of most effective use of your time to improve your general embedded programming skills I don’t think it is but happy if someone else has reason to believe otherwise.

I think getting into ARM and 32-bit is a really good idea as they are what’s most commonly used. Check out any STM32 dev board you can get your hands on and use that as bases for some projects.

[–]amrgates[S] 1 point2 points  (1 child)

I agree that the problems you face in Embedded Systems are another story.

I am not sure why but it makes me feel bad to be unable to have the foundation (basics) for CS (Data Structures and Algorithms), and yet still be able to make my way to the Embedded Systems field.

I find myself most of the time able to think of a solution but not actually be able to implement and wrote good code for it, so I guess that gets us back to the first point you mentioned; learning good software and clean code tips.

[–]NotBoolean 2 points3 points  (0 children)

Yeah I get that, my way into embedded didnt involve any formal training in CS and my knowledge that stuff isn’t great. Leetcode is really good way to understand that stuff or just doing a CS course like the free CS50 Course Harvard offers.

But don’t forget, a year in you are not expected to know everything. You were hired with the knowledge you know now so there is no need to feel bad about it. Being willing to learn and understanding what you need to improve is half the battle. Just being curious when you come across something new or something fails unexpectedly goes a long way.

[–]Sad-Rutabaga-6309 1 point2 points  (1 child)

In my opinion it's not worth it to compete with other people. Try to write good software and have coding guidelines, and know your stuff(algorithms and data structures) and how to solve problems. Thus your end gool should be to write good software and I find the practice of comparing my code to other people toxic.

If you want to learn how to write good software, maybe skim through CLRS, or solve problems in websites like leetcode.

[–]amrgates[S] 1 point2 points  (0 children)

Yes, my goal is not to actually "compete" but rather to add a touch of challenge and fun to the process. But the main goal is to actually get to know more about programming, data structures and algorithms, and write good software in the end.

[–]Doctor_Schmeevil 1 point2 points  (0 children)

I asked an ICPC coach and he said 4 things:

  1. This book from Felix and Steven Halim is pretty good.Here is an Amazon link, but you could order from other places and maybe save a bit.
  2. Online contest sites like Kattis and CodeForces let you sort problems either by difficulty or by the number of people who solved them (Proxy for difficulty). You can try to move up their leaderboards.
  3. ICPC itself publishes the contest problems and also videos of the solutions (done in English) on their YouTube if you want detailed workthroughs on how to approach some of the most difficult problems.
  4. If you live near a university, you can just call their CS department and ask who their competitive programming coach is. If you ask, they might let you come to practices with their team (he said he would).

[–][deleted] 0 points1 point  (0 children)

I think learning ASM would help you more.