16 ms·
If by low level you mean embedded systems programming, you will definetly need to be proficient in C. The other knowledge depends on the product that you will m
by Glawen 8y ago
If by low level you mean embedded systems programming, you will definetly need to be proficient in C.
The other knowledge depends on the product that you will make. For example I work in the automotive industry, where you need to be interested in cars and how the different parts work. Knowledge of electrical engineering and control theory is also valuable. There is a good book about it if you wat to learn how cars works: Bosch Automotive Handbook.
If you go that path, bear in mind that you will not be involved in creating clever algorithm. When safety is involved, you need to program very simple and easy code. The complexity lies in how all the parts and ECUs are interacting with each other. On the upside, you do not need to constantly learn new languages and library, and you accumulate expert knowledge which is interesting for companies.
- kevmo 8y agoI don't do embedded systems, but as a self-respecting software engineer, I am intending to develop proficiency in C/C++ over this next year. Does anybody have any recommended books/courses/projects?
- badpun 8y agoThe prevailing opinion is that one does not simply develop proficiency in C++ in a year.
- Legogris 8y agoC is definitely doable though. Loads of good recommendations of you search for them. Everyone will recommend K&R. |This book also goes through a lot of the lower-level things, debugging, etc: https://nostarch.com/hacking2.htm https://nostarch.com/hacking2.htm.
- imdsm 8y agoI have this and K&R. Recommend both /very/ highly.
- tonysdg 8y agoA quick word of warning: be sure to treat C and C++ as two completely separate languages that just happen to have similar syntax. Yes, you can use C++ as "C with classes" (I and many others sure have at times), but you're doing yourself a disservice most of the time if you do.
- Waterluvian 8y agoHuh. I always perceived C to be a subset of C++.
- rhn_mk1 8y agoCurrent versions of C have some features that are not present in current versions of C++ (e.g. designated initializers). But that's not the point. C and C++ are in practice used completely differently, so writing C++ using C concepts with some additions rarely happens in the wild.
- 95014_refugee 8y ago... except in the firmware space, where important C++ mechanisms (especially RTTI and exceptions) tend to be unavailable, giving rise to a (useful, powerful, fun) hybrid of the two.
- adrianN 8y agoThat used to be true, but becomes less true with each new version of the respective language specs. Sometimes the differences are obvious because legal identifiers in C can be keywords in C++, sometimes the difference is subtle, like with the rules regarding type punning. But the major point is that there are almost always safer or more ergonomic ways to do things using C++ features that are not present in C.
- SamReidHughes 8y agoFWIW I think he's wrong. Basically, when writing C, you should write code the same as if you'd write it in C++, except that you're using C. Because sometimes that's annoying, things can get less type safe, but in your head, there's a C++ program that you're representing.
- pjc50 8y agoDo C first. Achieve a small functioning project of your own, like the calculator in the back of Kernighan and Pike. This will give you a good understanding of pointer orientated programming and the C tooling and debug strategies. Then pick whether you want to start from the "front" or "back" of C++; i.e. learning the language in chronological order or in reverse. C++17 idiomatic style is very different from the 99 style that most existing C++ is written in. I would suggest picking a codebase to work on and learning its style and subset of C++ first.
- nwhm 8y agoI highly recommend Computer Systems: A Programmer's Perspective for learning C. In particular chapter 3 of that book is what made it all click for me. Understanding how C is translated down into assembly is incredibly useful for understanding pointers and reasoning about your code. EDIT. The book also comes with a collection of excellent projects, which the authors have made freely available online at http://csapp.cs.cmu.edu/3e/labs.html http://csapp.cs.cmu.edu/3e/labs.html
- jtsnow 8y agoAgreed! The labs are very informative and fun. One of my favorite undergrad courses used this book/labs ~10 years ago. Glad to see it is still being used!
- depr 8y agoZed Shaw's Learn C the Hard Way.
- rhexs 8y agohttp://hentenaar.com/dont-learn-c-the-wrong-way http://hentenaar.com/dont-learn-c-the-wrong-way
- depr 8y agoNah, that author wrote: >before you rewrite your C book, perhaps you should take the time to actually dig into it and learn C first (inside and out.) which is uninformed, as Zed wrote Mongrel and Mongrel2 in C. Saying he doesn't know C is ludicrous. He might have a different approach to C, but then argue this view instead of claiming your way is the only way. The author of that blog post is saying the book is bad because it is not the way he writes C. Not because it is objectively bad. Also, replies to that post like "Just for info K&R stands for "Kernighan" and "Ritchie", please, don't compare the bible of C with "just another book on C". It is a blasphemy." are hilarious. People are just parotting "read K&R!!" off of each other. The term Stockholm syndrome is overused but it is very appropriate for people who think C is actually good.
- yarrel 8y agoK&R is a remarkably good and concise introduction to C. I think that C is actually good, and that C++ is a Scooby-Doo sandwich of fail. But this is an opinion concerning a particular domain (low-level programming) that doesn't carry over to anywhere else.
- aleksei 8y agoAside from K&R, you might want to look at the Modern C PDF https://gustedt.wordpress.com/2016/11/25/modern-c-is-now-feature-complete/ https://gustedt.wordpress.com/2016/11/25/modern-c-is-now-fea... for an opinionated but sane guide. Also 21st Century C has been recommended, and it goes into tooling as well.
- jenscow 8y agoI learned it with "Advanced Programming in the UNIX Environment". > as a self-respecting software engineer Then you probably already know more about C than you realise: if, while, for, etc. all work the same as most other languages. What you're probably not used to is needing to define functions in advance, pointers, and memory (de)allocation. If you learn by doing, then with google and github, you can create a few simplified versions of unix utilities (cat, ls, grep -F). If you're on Windows, I recommend using a Linux VM, WSL, or Cygwin - it's easier to setup than the C tooling in Windows (and you're stealth learning something else). Once you know C, you can then move onto C++ (I stopped at C).
- lsofzz 8y ago> I learned it with "Advanced Programming in the UNIX Environment". Agreed. APUE is perhaps one of the best book available covering SUS, POSIX layer in detail.
- rajaganesh87 8y agoK&R,and Richard Stevens's books
- StillBored 8y agoPlease, please, please don't suggest people use the k&r book to learn C. It is one bad practice after another and many of the suggestions in that book have given C much of its reputation for buffer overflows, stack smashing, etc.
- rajaganesh87 8y agoGive me an example?
- pjungwir 8y agoFor the language, K&R is good, and Expert C Programming: Deep C Secrets by Peter van der Linden is a great second book. But all the fun stuff happens when you start talking with your OS, so get a book about that too. If you are planning to develop on Linux, Michael Kerrisk's The Linux Programming Interface is excellent. Much of it will be familiar to someone used to shells and the terminal, but there will be plenty of new ideas too, and even the stuff you know will get a much deeper perspective.
- jschwartzi 8y agoThe Linux Programming Interface is an excellent book. Beyond that, if you're looking to go deeper into the libc in Linux I would recommend taking a look at the man pages. They're very comprehensive, especially the pages in sections 7 and 8 which explain the operating system and administration tasks.
- hwj 8y agoThe german version is called "Kraftfahrtechnisches Taschenbuch" and is ~15EUR cheaper.
- Glawen 8y agoBut it is in german, and i believe that a native will not fully understand it if he did not work in the field in germany. I'm french and studied in the UK. I'm sometimes lost when my colleague use french technical terms, i have to ask the concept behind it to be able to identify the english term which i learnt during my studies.
- hwj 8y agoFrom a review on amazon: > However, as an English speaking engineer, I found many of the discussions rather clumsily written. I'm guessing that it was translated from the German by someone who doesn't thoroughly understand the subject matter.
- mttyng 8y agoWhat if -and I'm sorry to hijack- by low-level OP means a position as a C/C++ developer (asking for ~a friend~ me)? I've always been insanely attracted to the C variants and messed around with them to minor extents, but what might someone _need_ to know to be competitive if they're trying to make a move to that area of SE?
- Nursie 8y agoMemory management is the major difference between them and most of the higher level stuff. You need a good grasp of who owns what in a program so you can free and close things when they aren't needed (and not before). Less so in C++ these days of course, but definitely in C. It's worth picking up some basic gdb skills. Use of ddd can help with this. On windows you can use VS for most of this of course. Picking up the basics of valgrind will also help you. Get comfortable with the preprocessor. Get comfortable with Makefiles. Get comfortable pulling in library headers and binaries as needed. Errr.... I was (mostly) a C programmer for over a decade, but that's about all I can think of right now! --edit-- And someone below has just triggered me - FFS use stdint.h!
- pdpi 8y ago> You need a good grasp of who owns what in a program so you can free and close things when they aren't needed (and not before). Less so in C++ these days of course, but definitely in C You absolutely need to know in C++ too. Modern C++ just gives you tools to express ownership in code. Rust goes way further and gives you compile time correctness of your lifetime handling
- yarrel 8y agoFor C: Pointers, stacks (one in ever 23.7 bugs is a stack smashing bug), bit bashing and endianness, types and coercion at the byte level (see also: pointers, bit bashing), C strings, the stupid rules about when a variable's value is actually written to memory that need to die in a fire, memory allocation/clearing/copying/ownership/freeing, ALWAYS CHECK RETURN CODES, what the heck an lvalue is. This book is fun: http://shop.oreilly.com/product/0636920033677.do http://shop.oreilly.com/product/0636920033677.do