2009-12-07 4 views
2

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

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

Спасибо всем.

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

Моя первая попытка

void prim(int * array, int size) 
{ bool isPrime = true; 
for (int i=0;i<size;i++) 
{ 
for (int j = 2;j<i/2;j++) 
{ if (i%j==0){ 
     isPrime = ture; 
     *array = i; 
     array++; 

     } } } } 

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

  1. «i» не должно увеличиваться в конце первого цикла.
  2. если я% J == 0, IsPrime должен быть ложным
  3. операция массива должен поставить в конце цикла, когда мы находим простое

Мою вторую попытку, я добавил тест IsPrime, фиксированный некоторые ошибки и повторно отправили его.

void prim(int * array, int size) 
    { 
    bool isPrime = true; 

    for (int i=0;i<size;i++) 
    { 

    isPrime = true; 
for (int j = 2;j<i/2;j++) 
{ 
    if (i%j==0){ 
    isPrime = false; 
    } 

if (isPrime) 

{ 
    *array = i; 
    array++; 
} 
} 
} 

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

void prime(int * array, int size) 
    { 

    assert(array != null) 
    assert(size>0) 

    bool isPrime = true; 

    for (int i=0;i<size;) 
    { 

    isPrime = true; 
for (int j = 2;j<i/2;j++) 
{ 
    if (i%j==0){ 
    isPrime = false; 
    } 

if (isPrime) 
{ 
    *array = i; 
    array++; 
    i++; 
} 
} 
} 

И наконец. После интервью я почувствовал, что я действительно собрался. Я скопировал код в свою IDE, исправил все ошибки и протестировал их. Я отправил это моему интервьюеру и пожалел об этом. Я был очень удивлен, сколько ошибок я мог бы сделать в такой маленькой проблеме. Final Version

#include <iostream> 
#include <assert.h> 
using namespace std; 


void prime(int * array, int size) 
{ 

    assert(array != 0); 
    assert(size>0); 
    if (size == 1){ 
     *array=2; 
     return; 
    } 
    else { 
     *array=2; 
     array++; 
    } 
    bool isPrime = true; 
    int testNum = 3; 
    for (int i=1;i<size;) 
    { 
     isPrime = true; 
     for (int j = 2;j<testNum;j++) 
     { 
      if (testNum%j==0){ 
       isPrime = false; 
       break; 
      } 

     } 
     if (isPrime) 
     { 
      *array = testNum; 
      array++; 
      i++; 
     } 
     testNum++; 
    } 
} 
    int _tmain(int argc, _TCHAR* argv[]) 
    { 
     int t[5]={0,}; 
     int sample[5]={2,3,5,7,11}; 
     prime(t,5); 
     for (int i=0;i<5;i++){ 
      assert(t[i]==sample[i]); 
     } 
     return 0; 

    } 

сильный текст

+2

К сожалению, я достиг максимум 12 голосов за день, но это довольно субъективный и спорный корм. –

+1

Когда вы узнаете, пожалуйста, сообщите остальным из нас. –

+0

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

ответ

7

Вам не понравится ответ, а именно: быть программистом в течение 20 лет.

+1

Хотя, даже тогда ... –

8

много практики :)

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

+0

Возможно, это я, но попросить кого-нибудь написать фрагмент кода в интервью без какой-либо достойной IDE, это глупо - если это сложно, вы не потерпите неудачу. То же самое и с вопросом о каком-то суперкомплексном коде, который подвержен ошибкам на каждой отдельной строке, всегда отвечаю на такие вопросы: «этот код обесценивается/подвержен ошибкам, поэтому я бы изменил его на правильный, но поскольку я должен дать хороший ответ здесь это blablabla ». –

+0

Синтаксические ошибки могут очень хорошо убить интервью для вас, поэтому, если вы ожидаете сделать ошибки, скажите так и укажите, как вы их исправили, –

+1

Если вы не можете писать код без IDE, вы можете захотеть работать над этим , –

3

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

0

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

Также в первые годы работы в университете, когда у нас было введение в программирование в Pascal и C, мы все время должны «кодировать» на бумаге. Сначала я понял, что это глупо, теперь я помню все ошибки (тесты были сконструированы таким образом, чтобы они содержали все наиболее распространенные ошибки, например if (x = y) и т. Д.), Поэтому я недавно начал кодирование на бумаге в Java (хотя я, m все еще новичок java).

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

2

Вы, кажется, задавая два вопроса

  • Как ответить на вопросы кодирования на интервью?
  • Как написать хороший чистый код?

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

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

Что касается второго вопроса, практика. Практика. Напишите много кода. И да, разработка, основанная на тестах, является очень хорошей идеей.

0

как я могу написать правильный код, в первую очередь

Если бы этот вопрос был тривиальный ответ, мы не имели бы день работы.

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

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

1

Я расскажу вам, что работает на меня. Надстройка на детекторе ошибок на лету очень поможет вам.

Я использую Resharper. Перед его использованием у меня было слишком много ошибок во время компиляции.

2 недели назад мне пришлось использовать чистую визуальную студию (resharper not installed), и я скомпилировал источник почти без ошибок.

Некоторые люди говорят, что этот инструмент делает программиста ленивым, но я не согласен.

+0

есть что-то вроде resharper с python или fortran? – tarrasch

0

Slow гладкая, ровная быстро

    - Unknown 

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

0

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

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

0

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

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

Смежные вопросы