когда ошибка для клиента является действительно [закрытой] новой возможностью

Я думаю, что проблема связана с тем, что вы не передаете параметры в конструктор модала. то есть:

var pbModal = new Modal({
        content: pbContent,
        buttonAmount: buttonAmount,
        amountType: amountType,
        toAddress: toAddress,
        successField: successField,
        successMsg: successMsg,
        successCallback: successCallback,
        bchAmount: bchAmount
});

pbModal.open();

Вы можете попробовать приведенный выше код, как показано в примере ниже.

Кроме того, вы можете по-другому взглянуть на расчеты коэффициента / конверсии ... мне они показались неправильными, но я не уверен, какой должна быть правильная формула, поэтому я не пытался это исправить:) [119 ]

// Create an immediately invoked functional expression to wrap our code
(function() {
  // Define our constructor 
  this.Modal = function(buttonAmount, amountType, toAddress, successField, successMsg, successCallback, bchAmount) {

    // Create global element references
    this.closeButton = null;
    this.modal = null;
    this.overlay = null;

    // Determine proper prefix
    this.transitionEnd = transitionSelect();

    // Define option defaults 
    var defaults = {
      autoOpen: false,
      className: 'fade-and-drop',
      closeButton: false,
      content: "",
      maxWidth: 270,
      minWidth: 250,
      overlay: true
    }
    
    // Create options by extending defaults with the passed in arugments
    if (arguments[0] && typeof arguments[0] === "object") {
      this.options = extendDefaults(defaults, arguments[0]);
    }

    if (this.options.autoOpen === true){
      this.open();
    }
  }

  // Public Methods
  Modal.prototype.close = function() {
    var _ = this;
    this.modal.className = this.modal.className.replace(" paybutton-open", "");
    this.overlay.className = this.overlay.className.replace(" paybutton-open",
      "");
    this.modal.addEventListener(this.transitionEnd, function() {
      _.modal.parentNode.removeChild(_.modal);
    });
    this.overlay.addEventListener(this.transitionEnd, function() {
      if (_.overlay.parentNode) _.overlay.parentNode.removeChild(_.overlay);
    });
  }

  Modal.prototype.open = function() {
    buildOut.call(this);
    initializeEvents.call(this);
    window.getComputedStyle(this.modal).height;
    this.modal.className = this.modal.className +
      (this.modal.offsetHeight > window.innerHeight ?
        " paybutton-open paybutton-anchored" : " paybutton-open");
    this.overlay.className = this.overlay.className + " paybutton-open";
  }

  // Private Methods
  function buildOut(buttonAmount, amountType, toAddress, successField, successMsg, successCallback, bchAmount) {

    var content, contentHolder, docFrag, resultHolder, buttonAmount, amountType, toAddress, successField, successMsg, successCallback, bchAmount;

    /*
     * If content is an HTML string, append the HTML string.
     * If content is a domNode, append its content.
     */

    if (typeof this.options.content === "string") {
      content = this.options.content;
    } else {
      content = this.options.content.innerHTML;
    }

    // Create a DocumentFragment to build with
    docFrag = document.createDocumentFragment();

    // Create modal element
    this.modal = document.createElement("div");
    this.modal.className = "paybutton-modal " + this.options.className;
    this.modal.style.minWidth = this.options.minWidth + "px";
    this.modal.style.maxWidth = this.options.maxWidth + "px";

    // If closeButton option is true, add a close button
    if (this.options.closeButton === true) {
      this.closeButton = document.createElement("button");
      this.closeButton.className = "paybutton-close close-button";
      this.closeButton.innerHTML = "×";
      this.modal.appendChild(this.closeButton);
    }

    // If overlay is true, add one
    if (this.options.overlay === true) {
      this.overlay = document.createElement("div");
      this.overlay.className = "paybutton-overlay " + this.options.className;
      docFrag.appendChild(this.overlay);
    }

    // Create content area and append to modal
    contentHolder = document.createElement("div");
    contentHolder.className = "paybutton-content";
    contentHolder.innerHTML = content;
    this.modal.appendChild(contentHolder);

    // Create content area and append to modal
    resultHolder = document.createElement("div");
    resultHolder.className = "paybutton-content";
    resultHolder.id = "result";
    resultHolder.innerHTML = (this.options.buttonAmount + " " + this.options.amountType + " = " + this.options.bchAmount / 100000000 + " BCH");
    this.modal.appendChild(resultHolder);

    // Append modal to DocumentFragment
    docFrag.appendChild(this.modal);

    // Append DocumentFragment to body
    document.body.appendChild(docFrag);

  }

  function extendDefaults(source, properties) {
    var property;
    for (property in properties) {
      if (properties.hasOwnProperty(property)) {
        source[property] = properties[property];
      }
    }
    return source;
  }

  function initializeEvents() {

    if (this.closeButton) {
      this.closeButton.addEventListener('click', this.close.bind(this));
    }

    if (this.overlay) {
      this.overlay.addEventListener('click', this.close.bind(this));
    }
  }

  function transitionSelect() {
    var el = document.createElement("div");
    if (el.style.WebkitTransition) return "webkitTransitionEnd";
    if (el.style.OTransition) return "oTransitionEnd";
    return 'transitionend';
  }

  var payButton = document.getElementsByClassName("pay-button");
  for (var i = 0; i < payButton.length; i++) {
    var payButtons = payButton[i];
    // pull in attribute info from button when clicked
    payButtons.addEventListener("click", function(event) {
      var buttonAmount = this.getAttribute("amount");
      var amountType = this.getAttribute("amount-type");
      var toAddress = this.getAttribute("address");
      var successField = this.getAttribute("success-field");
      var successMsg = this.getAttribute("success-msg");
      var successCallback = this.getAttribute("data-success-callback");
      var bchAmount;
      var test = "test message";

      // check if amount type is set to bch or fiat
      if (amountType === "BCH") {
        bchAmount = 100000000 * buttonAmount;
      } else if (amountType === "Satoshi") {
        bchAmount = buttonAmount;
      }

      var qr = new QRious({
        element: document.getElementById('qr'),
        value: toAddress + "?amount=" + bchAmount,
        background: 'white', // background color
        foreground: 'black', // foreground color
        backgroundAlpha: 1,
        foregroundAlpha: 1,
        level: 'M', 
        mime: 'image/png', 
        size: 250, 
        padding: null 
      });

      var qrdecoded = qr.toDataURL();
      var pbContent =
        '<div>' + '<div>' +'<div>' +
        '<div><img src="' + qrdecoded + '"></div>' +
        '</div>' +
        '<div>' +
        '<div class="addressdiv"><span>Click QR code to Copy Address</span></div>' +
        '</div>' +
        '<div>' +
        '<div class="amountdiv"><span>Amount = ' + bchAmount + ' BCH</span></div>' +
        '</div>' +
        '<div>' +
        '<div><a href="' + toAddress + '?amount=' + buttonAmount + '"><button class="pbmodal-button"><span>Open in BitcoinCash Wallet</span></button></a>' +
        '</div>' +
        '<div>' +
        '<div><button class="pbmodal-button"><span>Send BCH with Badger Wallet</span></button></div>' +
        '</div>' +
        '<div>' +
        '<div><button class="pbmodal-button"><span>Send BCH with Telecope Wallet</span></button></div>' +
        '</div>' +
        '<div>' +
        '<div id = "result"></div>' +
        '</div>' +
        '</div>' +
        '</div>';

      var pbModal = new Modal({
        content: pbContent,
        buttonAmount: buttonAmount,
        amountType: amountType,
        toAddress: toAddress,
        successField: successField,
        successMsg: successMsg,
        successCallback: successCallback,
        bchAmount: bchAmount
      });

      pbModal.open();
    });
  }
}());
body {
  font-family: Helvetica, Arial, san-serif;
  font-size: 16px;
  margin: 0;
  padding: 0;
}

.pay-button {
  border-radius: 4px;
  cursor: pointer;
  border: 2px solid orangeRed;
  background: transparent;
  position: relative;
  padding: 0px;
  min-width: 150px;
  margin: 5px;
  color: #fff;
  /*For IE*/
}

.pay-button>span {
  display: inline-block;
  padding: 8px 16px;
  background: linear-gradient(45deg, #fff 50%, orangeRed 50%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

.pay-button:after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: linear-gradient(45deg, orangeRed 50%, transparent 50%);
  z-index: -1;
}

.pay-button>span,
.pay-button:after {
  background-size: 300%;
  background-position: 100%;
  transition: .6s, font-size 0.2s;
}

.pay-button:hover>span,
.pay-button:hover:after {
  background-position: 0;
  font-size: 1.1em;
  color: orangeRed;
  /*For IE*/
}

.pbmodal-button {
  border-radius: 4px;
  cursor: pointer;
  border: 2px solid orangeRed;
  background: transparent;
  position: relative;
  padding: 0px;
  width: 240px;
  margin: 0px 0px 10px 0px;
  color: #fff;
  /*For IE*/
}

.pbmodal-button>span {
  display: inline-block;
  padding: 8px 16px;
  background: linear-gradient(45deg, #fff 50%, orangeRed 50%);
  -webkit-background-clip: text;
  -webkit-text-fill-color: transparent;
}

.pbmodal-button:after {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: 0;
  right: 0;
  background: linear-gradient(45deg, orangeRed 50%, transparent 50%);
  z-index: -1;
}
.pbmodal-button>span,
.pbmodal-button:after {
  background-size: 300%;
  background-position: 100%;
  transition: .6s, font-size .2s;
}
.pbmodal-button:hover>span,
.pbmodal-button:hover:after {
  background-position: 0;
  font-size: 1.08em;
  color: orangeRed;
  /*For IE*/
}

/* Modal Base CSS */
.paybutton-overlay {
  position: fixed;
  z-index: 9998;
  top: 0;
  left: 0;
  opacity: 0;
  width: 100%;
  height: 100%;
  -webkit-transition: 1ms opacity ease;
  -moz-transition: 1ms opacity ease;
  -ms-transition: 1ms opacity ease;
  -o-transition: 1ms opacity ease;
  transition: 1ms opacity ease;
  background: rgba(0, 0, 0, .6);
}

.addressdiv {
  word-wrap: break-word;
  font-size: 14px;
  margin: 0px 0px 10px 0px;
}

.amountdiv {
  word-wrap: break-word;
  font-size: 16px;
  margin: 0px 0px 10px 0px;
}

.paybutton-modal {
  position: absolute;
  z-index: 9999;
  top: 50%;
  left: 50%;
  text-align: center;
  opacity: 0;
  overflow: auto;
  width: 100%;
  padding: 10px 10px 15px 10px;
  /*padding: 24px 20px;*/
  -webkit-transition: 1ms opacity ease;
  -moz-transition: 1ms opacity ease;
  -ms-transition: 1ms opacity ease;
  -o-transition: 1ms opacity ease;
  transition: 1ms opacity ease;
  -webkit-transform: translate(-50%, -50%);
  -moz-transform: translate(-50%, -50%);
  -ms-transform: translate(-50%, -50%);
  -o-transform: translate(-50%, -50%);
  transform: translate(-50%, -50%);
  border-radius: 5px;
  background: #fff;
}

.paybutton-modal.paybutton-open.paybutton-anchored {
  top: 20px;
  -webkit-transform: translate(-50%, 0);
  -moz-transform: translate(-50%, 0);
  -ms-transform: translate(-50%, 0);
  -o-transform: translate(-50%, 0);
  transform: translate(-50%, 0);
}

.paybutton-modal.paybutton-open {
  opacity: 1;
}

.paybutton-overlay.paybutton-open {
  opacity: 1;
}

/* Default Animation */
.paybutton-overlay.fade-and-drop {
  display: block;
  opacity: 0;
}
.paybutton-modal.fade-and-drop {
  top: -300%;
  opacity: 1;
  display: block;
}
.paybutton-modal.fade-and-drop.paybutton-open {
  top: 50%;
  -webkit-transition: 300ms top 300ms ease;
  -moz-transition: 300ms top 300ms ease;
  -ms-transition: 300ms top 300ms ease;
  -o-transition: 300ms top 300ms ease;
  transition: 300ms top 300ms ease;
}
.paybutton-modal.fade-and-drop.paybutton-open.paybutton-anchored {
  -webkit-transition: 300ms top 300ms ease;
  -moz-transition: 300ms top 300ms ease;
  -ms-transition: 300ms top 300ms ease;
  -o-transition: 300ms top 300ms ease;
  transition: 300ms top 300ms ease;
}
.paybutton-overlay.fade-and-drop.paybutton-open {
  top: 0;
  -webkit-transition: 300ms opacity ease;
  -moz-transition: 300ms opacity ease;
  -ms-transition: 300ms opacity ease;
  -o-transition: 300ms opacity ease;
  transition: 300ms opacity ease;
  opacity: 1;
}
.paybutton-modal.fade-and-drop {
  -webkit-transition: 300ms top ease;
  -moz-transition: 300ms top ease;
  -ms-transition: 300ms top ease;
  -o-transition: 300ms top ease;
  transition: 300ms top ease;
}
.paybutton-overlay.fade-and-drop {
  -webkit-transition: 300ms opacity 300ms ease;
  -moz-transition: 300ms opacity 300ms ease;
  -ms-transition: 300ms opacity 300ms ease;
  -o-transition: 300ms opacity 300ms ease;
  transition: 300ms opacity 300ms ease;
}

/* Close Button */
   .paybutton-close {
  font-family: Helvetica, Arial, sans-serif;
  font-size: 24px;
  font-weight: 700;
  line-height: 12px;
  position: absolute;
  top: 5px;
  right: 5px;
  padding: 5px 7px 7px;
  cursor: pointer;
  color: #fff;
  border: 0;
  outline: none;
  background: #e74c3c;
}

.paybutton-close:hover {
  background: #c0392b;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/qrious/4.0.2/qrious.min.js"></script>
<button class="pay-button" amount="0.038" amount-type="BCH" address="bitcoincash:qpajl5cvn0fjsqs30xppuxs3uuhzfdj4ncrcfdukt3" success-field="success" success-msg="Thank you for donating!">
<span>0.038 BCH</span>
</button>
<button class="pay-button" amount="0.1" amount-type="BCH" address="bitcoincash:qpajl5cvn0fjsqs30xppuxs3uuhzfdj4ncrcfdukt3" success-field="success" success-msg="Thank you for donating!">
<span>0.1 BCH</span>
</button>
<button class="pay-button" amount="10000" amount-type="Satoshi" address="bitcoincash:qpajl5cvn0fjsqs30xppuxs3uuhzfdj4ncrcfdukt3" success-field="success" success-msg="Thank you for donating!">
<span>10,000 Satoshi</span>
</button>

ОБНОВЛЕНО Я добавил вторую версию, которая улучшает необходимо генерировать код для всех элементов в модале (div, кнопки и т. д.) каждый раз, когда нажимаются кнопки.

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

Для OP: Я работал над повторным использованием этого div, но не обращал внимания на эффекты перехода на существующий код.

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

ОБНОВЛЕНИЕ 2 [ 1120]

Удален второй подход, так как OP не сочтет его полезным (иные требования, чем я ожидал)

6
задан Community 23 May 2017 в 12:04
поделиться

14 ответов

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

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

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

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

7
ответ дан 8 December 2019 в 02:35
поделиться

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

Например, если в документации/коммуникации говорится, "Создают отчеты". Если бы нет никакого определенного упоминания о динамических отчетах, я не признал бы клиент.

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

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

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

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

1
ответ дан 8 December 2019 в 02:35
поделиться

Я нахожусь в ситуации, где это происходит регулярно. Мы пишем веб-приложения, которые делают сложные задачи, затем после того, как мы завершили его согласно спецификации, которую пользователь затем изменит к лучшему и скажет, что "Мы хотим не всего X и Y, но и мы хотим Z также". Z не был в объеме проектных работ и таким образом не достижим в существующей системе, поэтому это должно быть переписано для размещения для недавно представленных "функций".

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

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

0
ответ дан 8 December 2019 в 02:35
поделиться

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

  • будущая работа - является там будущей работой с этим клиентом или потенциальной ссылкой для будущей работы? если так, Вы сдаетесь немного, пробуете к несерому другие области результатов, которые, на основе этого экземпляра, могли повернуться в правильном направлении.
  • оплата - они содержат оплату на основе этого? и работа все еще в пределах Вашего буферизированного бюджета (Вы действительно добавляли буфер для этого типа работы - право? хорошо, в следующий раз Вы будете - будущие клиенты платить за прошлые клиентские ошибки),
  • поставьте быстро, и часто - IKIWISI-I Знают Это, Когда я Вижу Его - если это перед клиентом раньше затем позже, затем 'интерпретация '/grey-areas уменьшается..., повторяющиеся доставки (даже неполные) творят чудеса

После факта Вы не можете сделать многого, если он сводится к судебному иску, Вы потеряли этот клиент и хорошую репутацию (потенциал) - быть осторожными в том, как трудно Вы продвигаете его

0
ответ дан 8 December 2019 в 02:35
поделиться

Ну, если это - истина, просто пойдите им. Что должно объяснить, согласились ли Вы на одну вещь, и теперь он хочет сделать дополнительный? Вы - получение, пододвигают обратно?

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

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

Надежда, которая помогает!

1
ответ дан 8 December 2019 в 02:35
поделиться

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

Существует два очевидных способа избежать этого.

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

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

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

И не входите в то положение снова.

1
ответ дан 8 December 2019 в 02:35
поделиться

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

2
ответ дан 8 December 2019 в 02:35
поделиться

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

3
ответ дан 8 December 2019 в 02:35
поделиться

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

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

По крайней мере, это - то, что я сделал.

2
ответ дан 8 December 2019 в 02:35
поделиться

Если это не находится в плане проекта / записанное соглашение, это вне объема.

4
ответ дан 8 December 2019 в 02:35
поделиться

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

Я пошел бы с Железным треугольным аргументом следующим образом:
1) Очевидно, мы хотим поставить продукт, в котором Вы нуждаетесь, поэтому позволяет, сотрудничают.
2) Все мы понимаем, что независимо от того, как мы добрались до текущей точки, мы можем только продвинуться от того, где мы сегодня.
3) Мы также понимаем, что реализация изменений займет время и деньги, которые должны поступить из куда-нибудь.
4) В этой точке Ваши опции - они (выберите один),
* Замена работа, которая была запланирована некоторую другую функциональность с работой, требуемой для этого изменения остаться на бюджете и расписании (жертвуют другими функциями),
* Расширяют крайний срок (крайний срок стоимости/сдвига увеличения)
* Добавляют ресурсы (стоимость увеличения)

Предупреждение: Хотя C имеет логический смысл, если Вы делаете, производственная работа типа (создайте еще 1 000 карандашей), в R&D работе как разработка программного обеспечения, это обычно - просто другая разновидность B, где Вы стоимость и сдвиг крайнего срока увеличены.

5
ответ дан 8 December 2019 в 02:35
поделиться

Я заряжаю их.

2
ответ дан 8 December 2019 в 02:35
поделиться

Важно, чтобы обе стороны поняли то, что они получают для своих денег очень вначале в процессе разработки программного обеспечения. Гибкая методология является превосходным инструментом для управления этим процессом. Если у Вас есть скорость своей команды, можно справедливо точно определить, сколько опций будет возможно добавить во время каждого повторения. Оцените задачи и сохраните клиента вовлеченным в приоритизацию, какие опции должны быть добавлены и какие вещи менее важны. Обязательно имейте клиентскую демонстрацию после каждого повторения для проявления рабочей функциональности, которую Вы оба согласовали, будет работать в конце текущего повторения. Если клиент хочет другую функцию или значительно изменяет ту, которую Вы уже согласовали, оцените, что число истории очков необходимый (единицы работы, используемые в Гибком), чтобы внести это новое изменение или переделать текущую часть функциональности. Это поможет им удалить другую функцию, которую они считают менее важными, чем текущий, которого они только что предложили. Это угождает всем и нет никаких неожиданностей, когда продукт "поставлется"

5
ответ дан 8 December 2019 в 02:35
поделиться

Вопросом являются приблизительно две темы: согласование и управление проектами.

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

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

  • У Вас могла бы быть возможность некоторый другой ogranisation, который сообщает непосредственно клиенту, чтобы внести свою лепту.

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

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

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

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

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

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

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

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

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

  • Когда это - или взаимный отказ клиента, запускаются с "нет". Пододвиньте обратно, чтобы позволить им понять Вас не поглощение стоимости, не полностью, по крайней мере. Не позволяйте им convience Вы, что они могут легко уйти, это никогда не верно. Этой точкой, даже если они не заплатили Вам пенс, их инвестиции в проект будут большими: время потратило, оценив предложения, принятие участия на встречах, усилие, они сделали связывающиеся требования, их и зависимость их клиента от проекта завершаемый главным образом вовремя и в пределах бюджета и т.д. Вам все еще, возможно, придется разделить затраты между этими двумя организациями, но начать с "нет" прояснять, что они так же ответственны за приложение усилия к своевременному, разъясняют требования, как Вы для обнаружения, что необходимо.

2
ответ дан 8 December 2019 в 02:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: