LINUX.ORG.RU

Настало время рефакторинга

 ,


0

2

Привет, практикующие разработчики. А подскажите ка новичку вот что: Приходите вы на новую работу и дают вам старый проект. Проект очень сырой, написан на технологиях и языке который вы не то чтобы знаете, да еще предыдущий разработчик такая студота как и вы и оставил кучу невнятных костылей. А работать надо, надо новой функциональности добавлять да старую работать заставить. И вот вы проработали полгода, напилили всякого, костылей да подпорок поставили, итого у вас есть работающий проект, добавление нового в который процесс мучительный, пора рефакторить, думаете вы. А начальство так не думает, им вообще плевать насколько там оно у вас унутре правильно работает, им важно то что сверху, и они хотят новое. Компания не it, поэтому начальству что-то объяснить сложно.

Как вы в подобной ситуации поступили бы?

//предвосхищая вопросы гуру из больших компаний: провинциальное it такое вот, тут кучу всего пишут вчерашние студенты, узких специалистов в какой-то технологии практически нет. Исключение - 1С

★★★★★

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

Ну и в фоне искать нормальное место работы, предпочтение отдать вакансиям из ДС2, в крайнем случае ДС.

trex6 ★★★★★ ()

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

pseudo-cat ★★★ ()

Компания не it, поэтому начальству что-то объяснить сложно.

Как вы в подобной ситуации поступили бы?

Тут два варианта: перобразовать компанию в IT или уйтi.

Deleted ()

А зачем вообще что-то объяснять? Если не IT, то начальство даже не поймёт, чем ты занимаешься. Иногда даже в IT не всякий начальник поймёт, что такое рефакторинг.

schizoid ★★★ ()

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

anonymous ()
Ответ на: комментарий от trex6

Ну и в фоне искать нормальное место работы, предпочтение отдать вакансиям из ДС2

в планах как только получу диплом. Пока только так.

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

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

RedPossum ★★★★★ ()
Ответ на: комментарий от pseudo-cat

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

я вот примерно такого-же мнения. Но жалко как-то своего труда.

RedPossum ★★★★★ ()
Ответ на: комментарий от RedPossum

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

Deleted ()

Как вы в подобной ситуации поступили бы?

Я бы уволился, честно. И пошёл бы во фриланс, если другой работы нет. В самом деле, ну что это такое, проект сырой, все плохо, сфера не IT, начальству пофиг - в этой ситуации даже трудно придумать, что вообще можно сделать :)

Alve ★★★★★ ()

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

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

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

у меня на руках есть проект на сях, пример кода могу скинуть, но в двух словах - в стиле бэйсика, глобальные переменные, повсеместное переиспользование однобуквенные переменных. Такое не поддается рефакторингу, вернее рефакторинг в этом случае = полное переписывание, причем на другом ЯП

pseudo-cat ★★★ ()

Кстати, если чисто технически - я бы поместил код проекта в git, сделал бы ветки: master для кода, который используется в работе, develop для добавления и тестирования новых фич для использования в работе и refactor для рефакторинга. Потом бы написал тесты, попытался бы максимально полно покрыть тестами используемый функционал и делал бы рефаторинг в ветке refactor, по одной какой-то фиче. Сделанную фичу бы тестировать тестами, переносил в develop, тестил ещё раз и потом бы мержил с master. Как-то так.

Alve ★★★★★ ()
Ответ на: комментарий от Alve

Я бы уволился, честно.

уже не могу, это мой дипломный проект

RedPossum ★★★★★ ()
Ответ на: комментарий от pseudo-cat

у меня на руках есть проект на сях, пример кода могу скинуть, но в двух словах - в стиле бэйсика, глобальные переменные, повсеместное переиспользование однобуквенные переменных. Такое не поддается рефакторингу, вернее рефакторинг в этом случае = полное переписывание, причем на другом ЯП

Рефакторингу поддаётся всё, что угодно. Вопрос в том, что это может быть действительно сложнее, чем переписывание. Но это очень крайние стадии.

Однобуквенные переменные переименовываются в полсекунды. Что значит «в стиле бэйсика» я не знаю. Глобальные переменные тоже можно определить, где используются и передавать в параметрах или другим способом. Конкретно из этого описания не понятно, почему не поддаётся рефакторингу.

Legioner ★★★★★ ()
Ответ на: комментарий от Legioner

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

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

RedPossum ★★★★★ ()
Ответ на: комментарий от Alve

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

RedPossum ★★★★★ ()
Ответ на: комментарий от RedPossum

Учитесь оценивать свое время. Это очень ценное качество программиста и приходит только с опытом. Для начала оценивайте время для себя, но обязательно оценку где-нибудь фиксируйте, например, в ежедневнике.

trex6 ★★★★★ ()
Ответ на: комментарий от Alve

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

trex6 ★★★★★ ()

Для начала я бы прочёл книжку «Эффективная работа с унаследованным кодом» М.Физерса.

iZEN ★★★★★ ()

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

ilovewindows ★★★★★ ()
Последнее исправление: ilovewindows (всего исправлений: 1)
Ответ на: комментарий от ilovewindows

но ты ведь под себя «отрефакторишь» и свалишь, другой придет и будет также ругать код.

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

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

RedPossum ★★★★★ ()
Ответ на: комментарий от iZEN

записал.

//Айзен, а ты правда прочитал все что советуешь?

RedPossum ★★★★★ ()

написан на технологиях и языке который вы не то чтобы знаете

Иду туда где интересные мне стеки технологий и предметные области.

Если что-то нерелевантное моим запросам - сводится к разумному минимум и оговариваются риски. Напимер я могу долго осваивать нечто кривое и проприетарное.

Как вы в подобной ситуации поступили бы?

Быстро, качественно, дешево - пусть выбирают любые 2 пункта.

outtaspace ★★★ ()
Ответ на: комментарий от pseudo-cat

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

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

Deleted ()
Ответ на: комментарий от trex6

ага, бесценнен, бесплатно приобретается в любой конторе, оптом.

Deleted ()
Ответ на: комментарий от Deleted

бесплатно

Если ваше время бесплатно, то мне вас жаль.

trex6 ★★★★★ ()
Ответ на: комментарий от trex6

упешный мен в треде, ховайтесь студенты

Deleted ()
Ответ на: комментарий от RedPossum

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

ilovewindows ★★★★★ ()
Ответ на: комментарий от Legioner

Однобуквенные переменные переименовываются в полсекунды.

наверное когда понятно что в них хранится, да?

ну и конечно язык, на котором это было написано 15 лет назад, уже очень устарел для таких задач


void TablicSxema::Tpacca(int El[],int Ef[],int Em[],TElem *Es[],int Eu[],int k,int p,int o,TElem *Pt)
{ int i, c=0, u=k, s=0, d, VidBl=0;
  char po[4]={0,0,0,0};
  TPut *pt;
  TSvetofor *sv;
  if (p==1 || p==2)
    (ms+o)->Ns=k;
  else
    (ms+o)->Ns=k+1;
  (ms+o)->mst=new struct Sv[k+2];
  for(i=0;i<k+2;i++)
  {  ((ms+o)->mst[i]).n_pz = -1;
     ((ms+o)->mst[i]).type = 0;
     ((ms+o)->mst[i]).put  = NULL;
     ((ms+o)->mst[i]).svet = NULL;
     ((ms+o)->mst[i]).npol = 0;
     //((ms+o)->mst)->pokaz[0] = 0;
  }
  if (p==1 || p==2)
    po[0]=3;
  else
  { if (Em[0]/*<0*/==-2)
      po[s]=6;
    else
      if (El[k]>1 && Ef[k])
      { if (Em[k]==-2)
          po[s]=6;
    	else
        { po[s]=8;
          if (Pt)
          { pt=(TPut *)Pt;
            if (pt->Nazn==TPut::nzPribl)
              VidBl=pt->VidBlock;
            else
            { sv=(TSvetofor *)Es[k];
              VidBl=sv->Signaling;
            }  
          }
          else
            VidBl=0;
          if (VidBl==TPut::vbAB3 || VidBl==TPut::vbAB4)
            po[s+1]=6;
        }
      }
      else
        if (Eu[0]==3 && p==0 && k==0)
          if (El[0])
            po[s]=2;
          else
            po[s]=1;
        else
        { po[s]=1;
          if (Pt)
          { pt=(TPut *)Pt;
            VidBl=pt->VidBlock;
          }
          else
            VidBl=0;
          if (!VidBl)
          { sv=(TSvetofor *)Es[k];
            VidBl=sv->Signaling;
            if (VidBl!=2)
              VidBl+=2;
          }
    	  switch (VidBl) {
    	    case TPut::vbAB3: po[s+1]=2;
              break;
    	    case TPut::vbAB4: po[s+1]=10;
              po[s+2]=2;
              break; }
        }
  }
  while (u>=0)
  { for (s=0; s<4; s++) ((ms+o)->mst+u)->pokaz[s]=0;
    ((ms+o)->mst+u)->put=NULL;
    if (Em[u]>0 && Ef[u]>1)
    { if (Em[u]>Ef[u]-1)
        d=Ef[u]-1;
      else
        d=Em[u];
      ((ms+o)->mst+u)->npol=(char)d;
      for (s=0; s<4 && po[s]; s++)
         if ((po[s]==8 || po[s]==6) && u==k)
           po[s]++;
      c=1;
    }
    else
    { c=0;
      ((ms+o)->mst+u)->npol=0;
    }
    if (u==k)
      for (s=0; s<4 && po[s]; s++)
      { if (po[s]==1 && Eu[u] && Eu[u]!=3)
          po[s]=10+Eu[u];
       /* if (po[s]==15)
        { po[s]=6;
          po[s+1]=8;
        }*/ 
    	if (po[s]==8 && Eu[u]==2)
          po[s]=12;
    	if (po[s]==12)
          po[s+1]=0;
    	if (po[s]<6)
          ((ms+o)->mst+u)->pokaz[s]=po[s];
    	else
          switch (po[s]) {
    	    case 6:
            case 7: ((ms+o)->mst+u)->pokaz[s]=6;
              break;
    	    case 8:  ((ms+o)->mst+u)->pokaz[s]=9;
              break;
    	    case 9:  ((ms+o)->mst+u)->pokaz[s]=10;
              break;
    	    case 10: ((ms+o)->mst+u)->pokaz[s]=11;
              break;
            case 11: ((ms+o)->mst+u)->pokaz[s]=7;
              break;
    	    case 12: ((ms+o)->mst+u)->pokaz[s]=8;
              break; }
      }
      else
        for (s=0; s<4 && po[s]; s++)
      	{ if (u==k-1 && p>2)
          { if (po[s]==12)
      	      if (!Ef[u] || El[u]==1)
                po[s]=5;
	      else
                po[s]=6;
	    else
            { if (!Ef[u] || El[u]==1)
                po[s]=2;
	      else
                po[s]=6;
            }
            ((ms+o)->mst+u)->pokaz[s]=po[s];
          }
	  else
          { if (po[s]==3)
	    { if (Em[u]==-2)
                ((ms+o)->mst+u)->pokaz[s]=6;
	      else
                if (!Ef[u] && Em[u]!=2 || El[u]==1)
	    	{ ((ms+o)->mst+u)->pokaz[s]=2;
                  po[s]=2;
                }
	    	else
                { po[s]=6;
	    	  if (El[u]==3)
                    ((ms+o)->mst+u)->pokaz[s]=12;
                  else
                   ((ms+o)->mst+u)->pokaz[s]=6;
                }
            }
            else
            { if (!Ef[u])
	      { if (po[s]>5 && po[s]<10)
	      	{ if (po[s]==7 || po[s]==9)
                    po[s]=4;
	      	  else
                    po[s]=5;
                  ((ms+o)->mst+u)->pokaz[s]=po[s];
                }
                else
                { if ((po[s]==2 || po[s]==5) && VidBl==TPut::vbAB4)
	    	  { ((ms+o)->mst+u)->pokaz[s]=11;
                    po[s]=10;
                  }
	    	  else
                    if (Eu[u]!=5)
                    { ((ms+o)->mst+u)->pokaz[s]=1;
                      po[s]=1;
                    }
                    else
                    { ((ms+o)->mst+u)->pokaz[s]=9;
                      po[s]=8;
                    }
                }
              }
	      else
                if (El[u]==1)
	    	{ if (po[s]==7 || po[s]==9)
                    { po[s]=4;
                      ((ms+o)->mst+u)->pokaz[s]=4;
                    }
	    	  else
                    if (Eu[u]!=5)
                    { po[s]=1;
                      ((ms+o)->mst+u)->pokaz[s]=1;
                    }
                    else
                    { ((ms+o)->mst+u)->pokaz[s]=9;
                      po[s]=8;
                    }
	    	}
	    	else
                { if (Ef[u]>1 && po[s]!=6 && po[s]!=8)
	     	    ((ms+o)->mst+u)->pokaz[s]=10;
		  else
                    ((ms+o)->mst+u)->pokaz[s]=9;
		  po[s]=8+c;
                }
            }
          }
        }
	u--;
  }
  for (i=0; i<=k; i++)
     ((ms+o)->mst+i)->svet=Es[i];
  (ms+o)->npok=s;
}
pseudo-cat ★★★ ()

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

Добавлять точки мониторинга: логи, счетчики производительности.

Добавлять валидацию данных в data-flow и control-flow - должны появляться разнообразные инварианты, хорошо документированные и соотносящиеся с предметной областью.

outtaspace ★★★ ()
Ответ на: комментарий от pseudo-cat

похоже на BorlandC++ в руках индусов забывших родной и выучивший русский

     ((ms+o)->mst[i]).n_pz = -1;
     ((ms+o)->mst[i]).type = 0;
     ((ms+o)->mst[i]).put  = NULL;
     ((ms+o)->mst[i]).svet = NULL;
     ((ms+o)->mst[i]).npol = 0;

когда уже введуть в ide механизм отрезания пальцев индивидуумам которые так пишут? такой хрени навалом в любом ооп-шном проекте

Deleted ()

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

Sectoid ★★★★★ ()
Ответ на: комментарий от Sectoid

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

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

Deleted ()
Ответ на: комментарий от Deleted

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

parsing failed. кто на ком стоял? ©

Sectoid ★★★★★ ()
Ответ на: комментарий от Sectoid

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

Deleted ()
Ответ на: комментарий от Deleted

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

если от продуктивности этого мальчика зависит твой манагерский карман — очень даже нередки.

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

Sectoid ★★★★★ ()
Ответ на: комментарий от RedPossum

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

А зачем тебе тогда рефакторинг?

dave ★★★★★ ()

днём работай с тем что есть,
ночью параллельно пили усовершенствованный вариант

Bad_ptr ★★★★ ()
Ответ на: комментарий от Sectoid

если от продуктивности этого мальчика зависит твой манагерский карман — очень даже нередки.

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

Deleted ()

Надо начальству на понятном языке обьяснить, типа яндекс с гуглем обновились (видели вчера картинка другая была?) и теперь надо прогу переделывать - не работает!

anonymous ()
Ответ на: комментарий от RedPossum

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

Значит, тут логика такая. Сейчас ты можешь валить на предыдущего писателя или писателей: мол программа такая-сякая, потому что «он» или «они» так написали раньше, а ты лишь дополнял функционал. После твоего «рефакторинга», да еще официально озвученного начальству, все шишки полятят уже в тебя. Да, и вообще, о каком рефакторинге может идти речь, если ты через два-три месяца собираешься уволиться после сдачи дипломной? Совершенно не понимаю тебя.

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

dave ★★★★★ ()
Ответ на: комментарий от RedPossum

Это пока лучшая книжка на сегодня. По крайней мере, она даёт точки опоры, от которых можно/нужно отталкиваться, а не искать решение в потьмах невежества.

//Айзен, а ты правда прочитал все что советуешь?

Нет, конечно. То, что я советую /прочитать/, выведено методом экспресс-анализа источников и отзывов о них.

iZEN ★★★★★ ()
Ответ на: комментарий от Deleted

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

Ты стал бы работать в конторе под началом человека, с таким мировозрением? Я — нет.

Sectoid ★★★★★ ()

Сопутствующий обычной разработке рефакторинг.

quiet_readonly ★★★★ ()
Ответ на: комментарий от dave

А зачем тебе тогда рефакторинг?

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

RedPossum ★★★★★ ()
Ответ на: комментарий от Legioner

Абсолютно согласен, добавлю только, что стоит припугнуть в стиле «возникнет срочная задача и из-за технического долга будет выполнятся месяц, даже если отложить всё остальное».

quiet_readonly ★★★★ ()
Ответ на: комментарий от pseudo-cat

Автоматическому рефакторингу поддаётся. Другое дело, что тулзов под это дело маловато.

quiet_readonly ★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.