工程師如何避免被客戶凹爆:如何比較順暢地進行接案工作?

- Talk at QSearch

關於我

- 自由工作者
- https://memes.tw
- https://codelove.tw

今天要解決兩個問題

為什麼越做越累
為什麼很難估時

1. 如何跟客戶溝通/如何拒絕客戶的要求
2. 談判以及紅色警報
3. Customized vs. Configurable Solutions
4. 服務產品化 Productized Services

如何跟客戶溝通/如何拒絕客戶的要求?

沒有技術上做不到的事情,但不能通通答應

客戶在想什麼

設身處地,如果你是甲方?

如何幫助客戶?

通通轉換成時間成本、金錢成本

客戶最害怕什麼?

講得晚了,就變得不行了

講得晚了,就被你拿捏了

 

心法

- 抓好 buffer
- 想清楚底線
- 給出解決方案建議
- 說明未來的可行性

專業地砍規格的方法?

提早交付,留給對方最終決定權

不要當下立刻答應

- 我評估一下,晚點給你答覆
- 應該可以,我跟PM討論一下

建立互信
累績經驗
建立話術包

談判以及紅色警報

有些人不是來交朋友的

越想越不對勁...

- 不愉快的工作經驗
- 強迫推銷的場合

叫你去騙大學生、腦波弱、好凹的、老實人,不難吧?

Let's practice...

- 提出開放性問題
- 鏡像模仿
- 公平炸彈
- 消耗你的意志力
- 誘導你就範

- 他是想討論 還是搞定我
- 我不是已經拒絕了嗎
- 不留情面地清楚的紅線

- 策略性發火
- 不要試圖操控我

- 避免跟這種人合作
- 用相同的語言溝通

Customized vs. Configurable Solutions

設計泛用型系統的時機與優缺點

/app
  /models
  /views
  /controllers

/qintelligence
  /models
  /views
  /controllers
  
/config.php

/.env

Why not? 為什麼沒人這樣做?

經驗分享

- https://cafenomad.tw
- https://urschool.org
- https://isportsmap.com
- taigimap

<?php

namespace App\Models;

use MikuCMS\Miku\Models\Behaviors\HasComments;
use MikuCMS\Miku\Models\Behaviors\HasPhotos;
use MikuCMS\Miku\Models\Behaviors\HasReviews;
use MikuCMS\Miku\Models\Behaviors\HasRevisions;
use MikuCMS\Miku\Models\Model;

class Shop extends Model
{
    use HasComments, HasPhotos, HasReviews, HasRevisions;

    public function getFeaturedImage()
    {
        $photos = $this->photos;

        if ($photos->count() > 0) {
            return $photos->first()->url;
        }

        return url('/design/shop.png');
    }
}
<?php

namespace App\Http\Controllers\Admin;

use MikuCMS\Miku\Http\Controllers\Admin\ModuleController as BaseModuleController;

class ShopController extends BaseModuleController
{
    protected $moduleName = 'shops';
}
<?php

namespace App\Http\Controllers;

use Auth;
use MikuCMS\Miku\Http\Controllers\Front\ModuleController as BaseModuleController;

class ShopController extends BaseModuleController
{
    protected $moduleName = 'shops';

    public function show($hash)
    {
        $shop = $this->itemRepository->find($hash);

        if ($shop->published === false) {
            if (Auth::check() && Auth::user()->id === $shop->user_id) {
                $message = '已送出「' . $shop->name . '」的資料,正在等待管理員審核。';

                return view('miku::pages.message', compact('message'));
            } else {
                $message = '無法顯示此頁面。';

                return view('miku::pages.message', compact('message'));
            }
        }

        return view('shops.show', compact('shop'));
    }
}
views
├── admin
│   ├── items
│   │   ├── comments
│   │   │   └── index.blade.php
│   │   ├── index.blade.php
│   │   ├── nav.blade.php
│   │   ├── photos
│   │   │   └── index.blade.php
│   │   └── revisions
│   │       └── index.blade.php
│   └── users
│       └── index.blade.php
├── pages
│   ├── items
│   │   ├── create.blade.php
│   │   ├── revisions
│   │   │   ├── create.blade.php
│   │   │   ├── index.blade.php
│   │   │   └── show.blade.php
│   │   └── show.blade.php
│   ├── message.blade.php
│   └── privacy.blade.php
└── widgets
    ├── actions-bar.blade.php
    ├── actions-card.blade.php
    ├── create-edit-review-form.blade.php
    ├── create-revision-form.blade.php
    ├── form-fields
    │   ├── radios.blade.php
    │   ├── select.blade.php
    │   └── textarea.blade.php
    └── summary-card.blade.php
@extends(config('miku.front_layout'))

@section('head')
    <script src='/vendor/pickadate@3.5.6/picker.min.js'></script>
    <script src='/vendor/pickadate@3.5.6/picker.date.min.js'></script>
    <script src='/vendor/pickadate@3.5.6/picker.time.min.js'></script>

    <link rel="stylesheet" href="/vendor/pickadate@3.5.6/classic.css">
    <link rel="stylesheet" href="/vendor/pickadate@3.5.6/classic.date.css">
    <link rel="stylesheet" href="/vendor/pickadate@3.5.6/classic.time.css">
@endsection

@section('content')
    <div class="container">
        <div class="row">
            <div class="col-lg-6">
                <div class="mt-4">
                    @include('miku::widgets.new-form', ['module' => $module])
                </div>
            </div>
        </div>
    </div>
@endsection
<?php

return [
    'modules' => [
        'shops' => [
            'rating_fields' => [
              // ...
            ],
            'info_fields' => [
              // ...
            ],
        ],
    ],
    'front_layout' => 'layout',
    'admin_layout' => 'layouts.admin',
    'auth_providers' => [
        'native' => [
            'enabled' => false,
        ],
        'facebook' => [
            'enabled' => true,
        ],
    ],
];

優點:後續的規模化、產品化、成就感

缺點:初始開發成本x5、資深限定

適用時機

已驗證的市場與產品

服務產品化 Productized Services

減少不確定性、規模化的生意

- 37express
- design agency

- pricing by modules
- base plan + plugins
- base system + customization
- weekly charges

今天要解決兩個問題

為什麼越做越累
為什麼很難估時

來讓台灣軟體產業更強大吧!

來討論 👉 https://codelove.tw

工程師如何避免被客戶凹爆:如何比較順暢地進行接案工作? - Talk at QSearch

By howtomakeaturn

工程師如何避免被客戶凹爆:如何比較順暢地進行接案工作? - Talk at QSearch

  • 37