Мой опыт обучения студентов и работы с людьми, которые изучали только языки высокого уровня, заключается в том, что они склонны мыслить на определенном высоком уровне абстракции и предполагают, что «все приходит бесплатно». Они могут стать очень компетентными программистами, но в конечном итоге им приходится иметь дело с некоторым кодом, имеющим проблемы с производительностью, а затем он начинает кусаться.
Когда вы много работаете с C, вы задумываетесь о распределении памяти. Вы часто думаете о разметке памяти (и о местонахождении кэша, если это проблема). Вы понимаете, как и почему определенные графические операции просто стоят дорого. Насколько эффективны или неэффективны определенные поведения сокетов. Как работают буферы и т. Д. Я чувствую, что использование абстракций на языке более высокого уровня, когда вы знаете, как оно реализовано под крышками, иногда дает вам «этот сверхсекретный соус», когда вы думаете о производительности.
Например, в Java есть сборщик мусора, и вы не можете напрямую назначать вещи памяти. И все же, вы можете сделать определенные варианты дизайна (например, с пользовательскими структурами данных), которые влияют на производительность по тем же причинам, по которым это может быть проблемой в C.
Кроме того, и в более общем смысле, я считаю, что для программиста-программиста важно не только знать нотацию big-O (которую преподают в большинстве школ), но и то, что в реальных приложениях постоянная также важна (какие школы пытаются игнорировать). Мой анекдотический опыт состоит в том, что люди с навыками на обоих уровнях языка, как правило, лучше понимают константу, возможно, из-за того, что я описал выше.
Кроме того, многие системы более высокого уровня, которые я видел, взаимодействуют с библиотеками и инфраструктурами более низкого уровня. Например, некоторые сообщения, базы данных или графические библиотеки. Некоторые драйверы для определенных устройств и т. Д. Если вы являетесь программистом, вам, возможно, придется даже рискнуть, и это поможет вам хотя бы понять, что происходит.