2012年1月3日 星期二

[碎碎念] 彼得原理


銀行中有一個怪制度,就是服務好的行員就會升遷做主管到後面蓋圖章,而服務不好的行員,因為升不了官,繼續留在第一線服務客戶。結果,在第一線服務客戶的,要嘛就是沒經驗的新手,不然就是表現不好的老員工,凡是第一線表現良好的員工,就被調成第二線的主管,從此不再面對客戶。

軟體公司好像也是如此,舉凡程式寫得好的程式設計師,就會升任為經理,而程式寫不好的員工,因為無法升遷,留在基層繼續寫程式。結果,留在基層寫程式的,要嘛就是新手,不然就是程式寫不好的程式設計師。凡是表現良好的程式設計師,就被調任成主管。從此不再寫程式。

如果這個現象再發展下去,就是做得傑出的經理,將會升官成副總,不再繼續做經理。

而繼續做經理的,多半是做不好現職而無法升遷的人。這樣下去,一個穩定的組織,每個位置都是升不上去,或是不適任現職的人。

這個現象早在勞倫斯. 彼得(Laurence J. Peter)於1969年出版 的「彼得原理」一書就發現了,也就是人們會因為自己的能力特質限制,升遷到一個無法勝任的位置就停住了,導致穩定組織中到處充滿不適任的人。

彼得原理告訴我們,企業不應該以升遷做為獎勵的方式,於是,好的銀行行員可以繼續做行員,但是待遇需要比照經理。好的程式設計師可以繼續留在基層寫程式,待遇甚至可以比照副總。

如此一來,彼得原理的現象就可以稍微解除。 

不過,當經理人所在的組織仍以升遷做為獎勵途徑的話,就要注意每次的升遷,都代表著自己能力與特質的改變。通常基層員工之所以優秀是因為他注意瑣碎事務的邏輯關係,但高階主管之所以成功是因為他強調直覺的人際關係。如果升遷後自己的特質沒有改變,自己可能就是下一個彼得原理的產物。或許,對一個升遷的經理人,要記住:「換了位置,一定要換腦袋」。  

在組織中,不同階層的人應該有著不同的腦袋。

聽說有一位貴婦到一家精品店買東西,買回去覺得不適合,第二天來退貨,不料基層店員說,我們公司的政策是貨既售出、概不退還,是不接受退貨的。這位貴婦搞不過這位店員,就大聲嚷嚷說要你們老闆出來。這位老闆在後台聽見了,一見這位貴婦是大戶,急忙出來,並馬上就改口說,退,當然退,誰說不可退貨的。

這位店員還很生氣的跟老闆說,你怎麼這麼搞不清楚,你不是才告訴我們不接受退貨的。

誰才是搞不清楚的人?

基層員工的腦袋通常是「搞不清楚的清清楚楚」,搞不清楚的是不知老闆的想法,清清楚楚的是做事的細節。

員工沒有錯,只是搞不清楚為什麼要那麼做。

公司有標準作業程式,但那是應付公司的標準狀況,眼看的就要得罪一位公司重要的客戶,這不是標準狀況,當然不適用標準作業程式。「搞不清楚的清清楚楚」的人最愛說按規定要如何。

基層經理人應該按制度來做事,只是他們搞不清楚,組織不是為制度而存在,應該是制度是為企業組織而存在。

當你升遷成中階主管時,你的腦袋就要變成「搞得清楚的清清楚楚」

你要先搞清楚老闆的想法,再去清清楚楚的做事。如果你凡事按制度來,你就是彼得原理的產物。

中階主管知道,制度不是目的,制度是幫助企業完成使命的工具,當老闆的意見與制度不一致時,通常改的是制度,而不是老闆的想法。聽起來很狗腿,企業中不正是有能力又狗腿的人升官嗎?

當你有機會成為高階主管,你就要學習「清清楚楚的搞不清楚」。清清楚楚的是企業的方向,搞不清楚的是對人對事的細節。高階主管面對的情境常常不是標準狀況,搞不清楚是給自己留彈性,但是心裡卻是清清楚楚的在盤算。他們知道「難得糊塗」的重要,得饒人處且饒人,和氣不就生財了嘛。

管理學院就在訓練這三種人,大學生沒有老闆,若不用功讀書,就會成為搞不清楚的搞不清楚。

研究生漸漸知道你的指導教授就是老闆,開始學習取悅老闆,所以畢業後有機會當中階主管,是清清楚楚的清清楚楚。

而 EMBA 的學生呢? 自己可能就是老闆,所以學校對 EMBA 課程的設計可是清清楚楚,對期末的考試呢? 就難得糊塗 ~

---
Welly

[ASP.NET+C#] GridView內建分頁加強版

ASP.NET 2.0 的 GridView內建分頁功能,預設是以「數字+符號」呈現,例如「<< ... 1 2 3 4 5 6 7 8 9 10 ... >>」,碰到客戶說看不懂符號的意思,只好想辦法把它改成中文字,變成「第一頁 上十頁 1 2 3 4 5 6 7 8 9 10 下十頁 最後頁」。

貼上程式碼如下,請參閱。使用Northwind的Customers資料表。
=======================
GridView_Pager_Number.aspx
=======================
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="GridView_Pager_Number.aspx.cs" Inherits="GridView_Pager_Number" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <p>
        <br />
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True"
            AllowSorting="True" AutoGenerateColumns="False" CellPadding="4"
            DataKeyNames="CustomerID" DataSourceID="SqlDataSource1" ForeColor="#333333"
            GridLines="None" onrowdatabound="GridView1_RowDataBound" PageSize="4">
            <PagerSettings Mode="NumericFirstLast" />
            <RowStyle BackColor="#EFF3FB" />
            <Columns>
                <asp:BoundField DataField="CustomerID" HeaderText="CustomerID" ReadOnly="True"
                    SortExpression="CustomerID" />
                <asp:BoundField DataField="CompanyName" HeaderText="CompanyName"
                    SortExpression="CompanyName" />
                <asp:BoundField DataField="ContactName" HeaderText="ContactName"
                    SortExpression="ContactName" />
                <asp:BoundField DataField="ContactTitle" HeaderText="ContactTitle"
                    SortExpression="ContactTitle" />
                <asp:BoundField DataField="Address" HeaderText="Address"
                    SortExpression="Address" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="Region" HeaderText="Region"
                    SortExpression="Region" />
                <asp:BoundField DataField="PostalCode" HeaderText="PostalCode"
                    SortExpression="PostalCode" />
                <asp:BoundField DataField="Country" HeaderText="Country"
                    SortExpression="Country" />
                <asp:BoundField DataField="Phone" HeaderText="Phone" SortExpression="Phone" />
                <asp:BoundField DataField="Fax" HeaderText="Fax" SortExpression="Fax" />
            </Columns>
            <FooterStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#D1DDF1" Font-Bold="True" ForeColor="#333333" />
            <HeaderStyle BackColor="#507CD1" Font-Bold="True" ForeColor="White" />
            <EditRowStyle BackColor="#2461BF" />
            <AlternatingRowStyle BackColor="White" />
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource1" runat="server"
            ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
            SelectCommand="SELECT * FROM [Customers]"></asp:SqlDataSource>
    </p>
    <div>
 
    </div>
    </form>
</body>
</html>

=======================
GridView_Pager_Number.aspx.cs
=======================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class GridView_Pager_Number : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        //取得Pager Row
        if (e.Row.RowType == DataControlRowType.Pager)
        {
            //取得內崁的TableRow
            TableRow trPager = (TableRow)e.Row.Controls[0].Controls[0].Controls[0];
            for (int i = 0; i < trPager.Controls.Count; i++)
            {
                TableCell tcPager = (TableCell)trPager.Controls[i];
                for (int j = 0; j < tcPager.Controls.Count; j++)
                {
                    //...格式必為LinkButton
                    if (tcPager.Controls[j].ToString() == "System.Web.UI.WebControls.DataControlPagerLinkButton")
                    {
                        //原Number顯示方式為"... 11 12 13 14 15 16 17 18 19 20 ..."
                        //故 (i=0 && LinkButton.Text="..."), 即目前頁數>10
                        LinkButton lbtn = (LinkButton)tcPager.Controls[j];
                        if ((lbtn.Text == "&lt;&lt;") && (i == 0))
                        {
                            lbtn.Text = "第一頁 ";
                        }
                        else if ((lbtn.Text == "...") && (i == 0))
                        {
                            lbtn.Text = "上十頁 ";
                        }
                        else if (lbtn.Text == "...")
                        {
                            lbtn.Text = " 下十頁";
                        }
                        else if (lbtn.Text == "&gt;&gt;")
                        {
                            lbtn.Text = " 最後頁";
                        }
                    }
                }
            }
        }
    }
}
=======================

---
Welly