Насколько переносимы навыки программирования между языками? - PullRequest
10 голосов
/ 22 апреля 2009

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

Ответы [ 17 ]

14 голосов
/ 22 апреля 2009

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

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

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

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

7 голосов
/ 22 апреля 2009

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

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

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

7 голосов
/ 22 апреля 2009

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

4 голосов
/ 22 апреля 2009

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

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

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

4 голосов
/ 22 апреля 2009

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

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

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

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

/ Johan

4 голосов
/ 22 апреля 2009

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

3 голосов
/ 22 апреля 2009

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

Но, независимо от того, насколько вы хороши, новый язык / парадигма / мышление требует некоторого привыкания. Если бы я нанимал разработчика Java. и у меня был разработчик c ++, который был «умным и добился цели», у меня была бы очень веская причина нанять его на кого-то с опытом работы с Java, учитывая, что «знакомый» и «продуктивный» - две разные вещи

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

2 голосов

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

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

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

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

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

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

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

StringBuffer strBuf = new StringBuffer();

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

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

StringBuffer fixedStrBuf = new StringBuffer(1024);

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

Кстати, 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, C ++ и Java (он дает ответы в конце книги по Java, потому что это более широко понимается, даже несмотря на то, что C предоставил бы намного более простые и более элегантные решения). Проработайте их в C, пока вы учитесь, и вы узнаете огромное количество знаний о том, что такое хорошее Java-программирование и Bad Java-программирование. Постскриптум найдите пару хороших C-праймеров - пытаться выучить C из оригинального руководства K & R (Kernighan and Ritchie) - это все равно, что выдержать двухдневный корневой канал. Если вы читаете K & R, найдите хотя бы второе издание. H & S (Harbison & Steel) - более понятное учебное пособие.

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

2 голосов
/ 22 апреля 2009

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

2 голосов
/ 22 апреля 2009

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

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

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

...