Как передаются навыки программирования между языками?

Если вы рекламировали позицию программирования для (скажем) PHP-разработчика и кого-то с большим резюме, но они были специалистом в (например) ASP.NET, а компонент PHP их резюме был очень легким, вы все еще считаете их за позицию? Считаете ли вы, что навыки программирования в общих козырных специфических языковых навыках?

Ответ 1

Хороший программист может легко переводить между языками.

Однако, улов в том, что хорошим программистом, по определению, является тот, у кого есть навыки, чтобы использовать различные языки уже. Если вы нанимаете кого-то, у кого есть опыт работы на одном языке и в среде программирования (компилятор, фреймворк и т.д.), Тогда у них может не быть необходимого опыта, особенно учитывая, что PHP-стек несколько отличается от .NET.

Если вы нанимаете кого-то, кто знает Java, PHP и имеет некоторый опыт работы с Python, то это указывает на то, что у них уже есть хороший опыт программирования, и гораздо более вероятно, что их навыки легко передаются на ASP.NET.

Это мое мнение.

Ответ 2

Очень переносимый. Для хорошего программиста синтаксис тривиален, если они знают, где и когда должны использоваться определенные шаблоны проектирования и методы решения проблем (и когда они доступны для языка), тогда не должно быть причин, по которым их не следует рассматривать.

Ответ 3

Совершенно верно. Общие навыки программирования являются основной ценностью для любого разработчика. На самом деле коммуникативные навыки могут даже перевесить все остальное. Хороший программист - хороший коммуникатор.

Программирование должно быть связано с сообщением, поскольку код будет тратить больше времени на просмотр и изменение, чем потребуется, чтобы записать его в первый раз, чтобы он лучше сообщал, что он должен делать.

Программист, который имеет прочную основу в основах программирования, должен иметь возможность быстро достигать скорости практически на любом языке.

Ответ 4

Не знакомство с какой-либо технологией/языком - это просто не знакомство. Если человек имеет отличное резюме и демонстрирует глубокое погружение в технологии, с которыми он работал, и имеет хорошие навыки программирования и решения проблем, он определенно должен быть рассмотрен. Единственное исключение - ситуация, когда вам нужен квалифицированный специалист прямо сейчас, потому что у вас нет времени или вы можете по нему по каким-то причинам научиться.

Ответ 5

Честно говоря, это может показаться не таким, но я считаю, что этот вопрос слишком расплывчатый, чтобы быть точным ответом. Я думаю, что большая часть этого будет зависеть от конкретной работы, на которую вы нанимаете.

Если вы ожидаете, что кто-то войдет и будет сразу продуктивен на высоком уровне, то вы действительно хотите, чтобы кто-то с большим опытом работы с языком, который вы будете использовать. Всегда лучше, чтобы по крайней мере один человек возглавлял проект, который действительно понимает язык и как его использовать, не "выбирая зерно" в своих дизайнерских решениях. Точно так же, если у кандидата есть сильные языковые предпочтения, и это тот тип, который всегда будет жаловаться на ваш выбор языков (рассказывая о том, как его фейв сделал бы все лучше), тогда он не будет вашим лучшим выбором для этой роли.

С другой стороны, если это не обязательно ведущий разработчик проекта, могут быть другие варианты. Полноценно возможно, чтобы компетентный PHP-разработчик пришел и помог с проектом Java и наоборот. Сильный разработчик с хорошими общими навыками будет лучше, чем средний разработчик PHP во многих отношениях. Задача там, как всегда, заключается в оценке их навыков и в том, смогут ли они быстро адаптироваться к новой платформе.

Ответ 6

Трудная часть этих языков высокого уровня - это "библиотека классов", требуется некоторое время, чтобы использовать функции "встроенные", которые вы можете использовать. (вы не хотите изобретать велосипед).

Но если вы только посмотрите на язык сам, поскольку большинство языков связаны друг с другом каким-то образом, у парня, который знает 5+ языков, есть преимущество перед парнем, который знает только один язык.

И если вы свариваете это до вербовки, это вопрос о том, как долго вы планируете держать программиста? Он нанят, чтобы сделать быструю работу, скажем, 2-3 месяца, или вы нанимаете нового программиста, чтобы вы хотели сохранить 3+ года?

Многоязычный парень, вероятно, будет лучше в долгосрочной перспективе, но потребуется некоторое время, чтобы ускорить его, если он не знает этого конкретного языка....

/Johan

Ответ 7

Согласен, хороший программист может передавать между языками.

Но, независимо от того, насколько вы хороши, новый язык/парадигма/мышление привыкает. Если бы я нанял java dev. и у него был С++ dev, который был "умным и сделал все", у меня была бы очень веская причина нанять его/ее над кем-то с java-опытом, считая, что "знакомые" и "продуктивные" - это две разные вещи.

В двух словах, если мне нужен был старший, человек с соответствующим опытом побеждает кого-то, кто знаком с синтаксисом. Младший, может быть, тогда есть некоторая свобода.

Ответ 8

Я хотел бы добавить предостережение к другим ответам здесь, что, хотя навыки программирования ценны и передаются, отделы кадров могут просто разорвать ваше резюме, потому что у вас нет "правильного" материала в вашем резюме. Если вы затем приступите к решению этой проблемы, поместив язык в свое резюме, вы не готовы отвечать на вопросы о интервью, вы, вероятно, не будете впечатлять людей, которые вас берут на собеседование. Это уловка-22 и довольно большая проблема при найме на некоторые фирмы, что отстой для фирм и для людей, которые хотят там работать, и для людей, которые уже там работают.

Ответ 9

Я бы сказал, что в целом, будучи хорошим программистом на PHP, у вас есть очень хорошие шансы стать хорошим программистом ASP.NET, если вы потратите время на это. Возможность программировать - это талант, а изучение языка - это, в основном, обучение. Сказав это, я считаю, что там гораздо больше, чем знаком с синтаксисом языка. Хороший программист должен хорошо понимать доступные рамки, библиотеки, специфические для языка методы и т.д. Программист ASP может писать PHP-код после прочтения хорошей книги PHP. Но для того, чтобы стать хорошим программистом на PHP, требуется гораздо более глубокое понимание, и это понимание приходит в основном из опыта.

Итак, все идет к этому - хороший программист, вероятно, может узнать большинство языков. Вопрос в том, платите ли вы за то, что он стал опытным программистом?

Ответ 10

Умения легко переносятся, но то, что делает человека отличным на определенном языке, а не просто в порядке, - это их глубокое знание этих языковых причуд.

Каждый язык имеет свои странные идиомы, которые можно подобрать только после работы с языком в течение некоторого времени. Быть опытным на другом подобном языке действительно не помогает в этом вообще.

Даже для тех, кто знает ASP.NET, как заднюю часть их руки, при первом переключении на PHP все еще будет существенная фаза "WTF", которую они должны преодолеть, во время которой они будут производят довольно неприятный код. Это может быть рабочий код, но он не будет легко обслуживаться и, вероятно, не будет хорошо интегрироваться с остальной частью проекта.

Ответ 11

На одном уровне навыки программирования не зависят от языка. Программирование - это в основном решение проблем. Вам нужно знать, как идентифицировать проблему, анализировать ее и разбивать на ее основные компоненты и разрабатывать решение (будь то алгоритмы, структуры данных или, чаще всего, оба). Каждый язык - это просто набор инструментов, который вы используете для построения решения. Некоторые, такие как Java и С#, проще в использовании, но имеют яркие инструменты, поэтому вы редко можете точно настроить свое решение так, как вы этого хотите. C - самый гибкий и мощный язык (вне ассемблера). Это дает вам силу и свободу делать в значительной степени именно то, что вы хотите сделать - включая оплошное злоупотребление (преднамеренное, конечно) нарушение его (неукрепленных) правил. Но его набор инструментов заполнен множеством очень острых инструментов, и для этого требуется гораздо больше опыта в области программирования для безопасного использования (что делает его таким хорошим мостом между, скажем, Java и машинным кодом, который в конечном итоге выполняется процессором (ядрами).

Есть одна вещь, которая меня беспокоит в этом разговоре, и это огромное количество людей, которые запрограммировали только на сильно абстрагированных языках, таких как Java, С# и любой из скриптовых веб-языков (Python сразу приходит на ум). Я запрограммировал на хороших двухбалльных языках (если не больше) за мое 37-летнее кодирование.

Верно, что каждый новый язык имеет кривую обучения, исходящую от синтаксиса, семантики, библиотек и особенностей. Но есть еще одна проблема, которую я не рассматриваю здесь.

Сегодня большинство программистов обучаются в значительной степени исключительно на высокоуровневых, высоко абстрагированных языках и не имеют ни малейшего представления о том, что их код действительно будет делать под обложками. Вы общаетесь с совершенно чуждым "мозгом", то есть одновременно очень глупым, и благодаря способности объединять миллионы, даже миллиарды простых операций и запускать их практически на невероятно высокой скорости, может имитировать виртуальный блеск.

Программисты, с которыми я работаю, которые никогда не были основаны на языках ассемблера, C или даже на С++, но которые думают о программировании только на уровне Java, С# и т.д., в конечном итоге совершенно не понимают, что такое красивый код они пишут на самом деле, и каковы преимущества и (часто DIRE) последствия выбора, который они делают в том, как они владеют языком.

Вам нужен опыт работы с языком, который может привести вас к низкому уровню - особенно с командной строкой DOS или Unix без слоев GUI - скажем, до того, как операционные системы защищенного режима изолируют программиста от кодирования до голого металла и имеют дело с порты, адреса памяти, таблицы адресов прерываний, регистры и основные операционные коды и операнды, которые фактически выполняет компьютер.

Я приведу вам пример того, о чем я говорю. Сколько Java-программистов когда-либо инициализировали StringBuilder или StringBuffer так?

StringBuffer strBuf = new StringBuffer();

а затем выполнил дюжину операций .append()? Особенно в цикле, который выполняет тысячи, даже миллионы раз. То, о чем не знает средний программист Java, заключается в том, что конструктор по умолчанию создает внутренний буфер размером 16 байт. Как каждый strBuf.append(str); увеличивает длину содержимого StringBuffer, он вынужден выделить новый, больший блок памяти, скопировать существующее содержимое в память, добавить новую строку и затем пометить старый буфер для gc. Это заканчивается огромным количеством ненужных распределений, копий и фрагментированной памяти вне области видимости, которая должна быть gc'd.

Если вы определяете StringBuffer как раз вне вашего цикла и используете конструктор, который дает ему начальный размер буфера, который является более чем достаточно большим для обработки ожидаемой конечной длины, вы выделяете один блок памяти и никогда не должны выполнять все те тысячи или миллионы ненужных перераспределений, копий и gc.

StringBuffer fixedStrBuf = new StringBuffer(1024);

Затем каждый .append() в вашем цикле просто копирует новую строку в существующую в том же буфере. Когда вы закончите и загрузите содержимое с помощью fixedStrBuf.toString(), просто вызовите fixedStrBuf.setLength(0); который оставляет буфер сам по себе, но повторно инициализирует его для повторного использования. Вы также можете выполнить вызов setLength (0) в верхней части каждого цикла. Просто убедитесь, что объект StringBuffer выйдет за пределы области действия, как только вы выйдете из цикла обработки, который постоянно его повторно использует, или, по крайней мере, присвойте ему значение NULL, когда вы закончите с ним, так что это может быть gc'd, когда больше не нужно.

BTW, StringBuilder быстрее, чем StringBuffer, и является предпочтительным, если вам не нужно делать код безопасным. Кроме того, вы можете получить еще большую скорость и гибкость (и большую защиту от неожиданных ошибок) с помощью метода Apache Commons:

org.apache.commons.lang.text.StrBuilder;

Как и StringBuilder, он не синхронизирован, поэтому используйте его осторожно, но у него есть как минимум десяток других полезных методов, в том числе .clear(), который делает то же самое, что и .setLength(0), но делает код немного более читаемым.

Несколько лет назад меня пригласила крупная транспортная компания после того, как их звездный программист на Java (10% его класса в Penn и прошел тест Brainbench) написал программу ETL (datamining), которая предполагалась взять данные, которые пришли в одночасье, сделать некоторые крупные преобразования на нем и создать временный датамарт, из которого старшие инженеры могли бы вызывать графики, сетки и отчеты, необходимые для их дневной работы. К сожалению, его программа заняла от 300 до 360 минут (от 5 до 6 часов), и инженеры упали за полдня, потому что они не могли получить данные поддержки принятия решений до обеда. Я потратил две недели на анализ и реорганизацию программы и без какой-либо серьезной перезаписи сократил время выполнения до 15-20 минут. В этой программе, среди многих других злоупотреблений на языке (все правильные, что касается синтаксиса и семантики), программист фактически использовал вышеупомянутый StringBuffer(), причем около десятка добавляет каждый проход в цикле, который прошел намного больше миллиона создавая до пятнадцати миллионов ненужных ассигнований, копий и удалений. И это была всего лишь одна строка кода. Я мог бы написать книгу обо всех способах, которыми программист не знал о низкоуровневых последствиях своего прекрасного, но кошмарно неэффективного кода Java.

Итак, мой совет: вместо того, чтобы пытаться добавить Ruby или Python или какой-либо новый горячий абстрактный язык в ваш репертуар, возьмите несколько месяцев вашего свободного времени, изучите C (либо C99, либо даже старше - не беспокоиться о попытке догнать новый стандарт C11, который почти никто не использует), и получить книгу под названием "Cracking the Coding Interview" от Gayle Laakmann, которая, среди прочих жемчужин, имеет 150 небольших кодирующих упражнений типа вас могут попросить ввести код на доске во время технического интервью. Все они могут быть решены на C, С++ и Java (он дает ответы в конце книги на Java, потому что он более широко понимается, хотя C предоставит гораздо более простые и элегантные решения). Проработайте их на C во время учебы, и вы узнаете огромное количество знаний о том, что такое хорошее программирование на Java и программирование Bad Java. Постскриптум найти пару хороших C-праймеров - попытка изучить C из оригинального руководства K и R (Kernighan и Ritchie) - это как прочный двухдневный корневой канал. Если вы читаете K и R, по крайней мере, найдите второе издание. H и S (Harbison and Steel) - более четкое учебное пособие.

BTW, JVM, которые запускают ваш p-код Java, записываются на C или С++.

Ответ 12

Это зависит. Если у кого-то есть сильный технический фон, талант и страсть, довольно легко подобрать новый язык или домен. Я имею в виду, что весь смысл информатики - вещи меняются ежедневно, и каждый хороший программист должен уметь адаптироваться.

Ответ 13

Пока передача осуществляется между языками программирования той же парадигмы, я думаю, что она легко переносится. Преобразование программиста на Java-программиста довольно сложно, и многие учителя, которых я знаю, предпочитают учеников, не имеющих опыта работы с фонами типа "C" при изучении Java.

Ответ 14

PHP и ASP.NET могут быть похожими, но PHP и С# очень разные, и если вы используете С# 3, то есть очень резкая кривая обучения. Если программист может просто выполнять работу с интерфейсом, это не будет большой проблемой.

Теперь, как переносимое знание между языками отличается, поскольку это зависит от того, является ли язык одним и тем же типом программирования (структурным, функциональным, объектно-ориентированным). Большой программист C не может передавать свои знания в ООП или FP, например, так как подход к дизайну настолько отличается.

Ответ 15

Неверный вопрос, я думаю. Это как переносимые навыки программирования между рамками. Разработчик asp classic и разработчик jsp могут, вероятно, читать и писать код друг друга. То же самое для Java Server Faces и ASP.NET. Как я знаю из моего текущего проекта, разработчик С# winforms может с трудом передать свои таланты проекту С# ASP.NET. Синтаксис - это такая небольшая часть основных языков программирования (я эксплоирую такие странные вещи, как Prolog и F #, которые имеют принципиально иной подход к коду, чем семейство курчавых привязок)

Ответ 16

Одна из вещей, которые формируют мое отношение к любой технологии (/platform/product/language), - это то, насколько конкретным является опыт обучения. У меня есть коллеги, которые очень хорошо разбираются в MS Access и на протяжении многих лет создали огромное количество заказных бизнес-систем (с переменным качеством). Но, несмотря на это, они почти ничего не знают о sql. Если они потратили три месяца на поддержку небольшого сайта PHP/MySQL, то они были бы в гораздо лучшем положении (умения умные), чтобы хотя бы начать искать системы Informix/Sybase/SQL Server/etc.

Помимо определенного момента, хотя стоимость обучения новым техникам, вероятно, исчезает. Переключение между PHP/VBscript мне показалось довольно раздражающим, когда вы учитесь, так как простые изменения в соглашениях (например, использование ";" ) добавили, что в процессе обучения мало необходимости в раздражении. Совсем недавно мне пришлось переключаться между С#, Perl и VBScript совсем немного, и это просто не проблема - вы следуете правилам каждой грамматики, не думая об этом.

Ответ 17

Если вы дали себе хорошее образование в программировании да. Под этим я подразумеваю, что вы много программировали, узнали, что процессор делает на низком уровне, понимают алгоритмы и сложность выполнения, и хорошо разбираются в проблемах.

Я думаю, что на некоторых языках есть длинная кривая обучения. Возможно, вы сможете зайти в команду программистов на C++ и помочь им без какого-либо опыта, но вы, конечно же, будете часто сражаться с темными уродливыми углами.

Языки высокого уровня, такие как sql или python, могут выглядеть очень легко, но люди с многолетним опытом понимают трюки, недокументированные функции и ямы, которые не очевидны по номиналу.