<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    小方的Java博客

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      27 隨筆 :: 17 文章 :: 115 評論 :: 0 Trackbacks

    2006年8月2日 #

    我在做公司某個框架時有這么一個需求。每次調用dwr的方法前要檢查用戶是否已經登錄,否則就不能執行并且退到首頁。

    當然了,做攔截器有很多方式,但經過研究發現DWR自帶很多插件,其中就有一個調用處理的插件。具體做法如下。

    在web.xml里的DWR配置中加入一個參數:
    <init-param>
                
    <param-name>
                    org.directwebremoting.extend.Remoter
                
    </param-name>
                
    <param-value>com.xxx.base.framework.web.MyDWRRemoter</param-value>
            
    </init-param>

    然后自己創建這個實現類。
    public class MyDWRRemoter extends DefaultRemoter
    {

        
    public Replies execute( Calls calls )
        
    {
            HttpSession session 
    = WebContextFactory.get().getSession();
            ISessionContainer sc 
    = ( ISessionContainer ) session.getAttribute( ISessionContainer.SESSION_CONTAINER_KEY );

            
    //session檢查
            if ( sc == null || sc.getUserInfo() == null )
            
    {
                logOut();
                
    return super.execute( new Calls() );
            }

            
    else
            
    {
                IUserInfo userInfo 
    = sc.getUserInfo();
                
    if(!SecurityFactory.getInstance().isOnline( userInfo.getUserID(), session.getId() ))
                
    {
                    logOut();
                    
    return super.execute( new Calls() );
                }

            }

            
    return super.execute( calls );
        }


        
    private void logOut()
        
    {
            WebContext wct 
    = WebContextFactory.get();
            Util utilThis 
    = new Util(wct.getScriptSession());
            utilThis.addScript( 
    new ScriptBuffer("logOut()"));
        }

    }

    其中,檢查用戶是否登錄,如果沒有登錄就返回一個空的super.execute( new Calls());, 不能返回null否則會報錯。
    檢查通過就調用super.execute( calls );  其實calls里還能獲得很多信息。

    最后大家注意logOut方法,這里用到了DWR2.0新功能:DWR反向調用,就是DWR調用javascript,具體用法大家網上可以查到,需要配置的,我這里就不多說了。補充一下,addScript調用的是html里的function logOut().

    這樣的話,如果用戶session超時,或被管理員踢掉,一旦他做任何dwr操作就會被強迫登出到首頁了。
    posted @ 2008-12-05 20:42 方佳瑋 閱讀(2902) | 評論 (3)編輯 收藏

    很久以前看某本書整理的,忘了哪本了,現在貢獻出來。

    1)在select語句中使用條件邏輯

    1select ename,sal,   
    2       case when sal <= 2000 then 'UNDERPAID'  
    3            when sal >= 4000 then 'OVERPAID'  
    4            else 'OK'  
    5       end as status   
    6from emp   


    ENAME SAL STATUS
    ---------- ---------- ---------
    SMITH 800 UNDERPAID
    ALLEN 1600 UNDERPAID
    WARD 1250 UNDERPAID
    JONES 2975 OK
    MARTIN 1250 UNDERPAID
    BLAKE 2850 OK
    CLARK 2450 OK
    SCOTT 3000 OK
    KING 5000 OVERPAID
    TURNER 1500 UNDERPAID
    ADAMS 1100 UNDERPAID
    JAMES 950 UNDERPAID

    FORD 3000 OK
    MILLER 1300 UNDERPAID

     

    2)從表中隨機返回n條記錄

    1select *   
    2  from (   
    3    select ename, job   
    4    from emp   
    5    order by dbms_random.value()   
    6  )   
    7  where rownum <= 5 

     

    3)按照子串排序

    比如要從EMP表中返回員工名字和職位,并且按照職位字段最后2個字符排序

    1select ename,job   
    2  from emp   
    3order by substr(job,length(job)-2

    ENAME JOB
    ---------- ---------
    KING PRESIDENT
    SMITH CLERK
    ADAMS CLERK
    JAMES CLERK
    MILLER CLERK
    JONES MANAGER
    CLARK MANAGER
    BLAKE MANAGER
    ALLEN SALESMAN
    MARTIN SALESMAN
    WARD SALESMAN
    TURNER SALESMAN
    SCOTT ANALYST
    FORD ANALYST

     

    4)處理空值排序

    當被排序的列存在空值,如果希望空值不影響現有排序

    1select ename,sal,comm   
    2   from emp   
    3order by comm nulls last 

     

    ENAME SAL COMM
    ------ ----- ---------
    TURNER 1500 0
    ALLEN 1600 300
    WARD 1250 500
    MARTIN 1250 1400
    SMITH 800
    JONES 2975
    JAMES 950
    MILLER 1300
    FORD 3000
    ADAMS 1100
    BLAKE 2850
    CLARK 2450
    SCOTT 3000
    KING 5000

    1select ename,sal,comm   
    2  from emp   
    3order by comm desc nulls first 


    ENAME SAL COMM
    ------ ----- ----------
    SMITH 800
    JONES 2975
    CLARK 2450
    BLAKE 2850
    SCOTT 3000
    KING 5000
    JAMES 950
    MILLER 1300
    FORD 3000
    ADAMS 1100
    MARTIN 1250 1400
    WARD 1250 500
    ALLEN 1600 300
    TURNER 1500 0

    5)根據數據項的鍵排序

    比如如果job是“SALESMAN”,根據COMM排序,否則根據SAL排序

    1select ename,sal,job,comm   
    2  from emp   
    3 order by case when job = 'SALESMAN' then comm else sal end  


    ENAME SAL JOB COMM
    ---------- ---------- --------- ----------
    TURNER 1500 SALESMAN 0
    ALLEN 1600 SALESMAN 300
    WARD 1250 SALESMAN 500
    SMITH 800 CLERK
    JAMES 950 CLERK
    ADAMS 1100 CLERK
    MARTIN 1250 SALESMAN 1300
    MILLER 1300 CLERK
    CLARK 2450 MANAGER
    BLAKE 2850 MANAGER
    JONES 2975 MANAGER
    SCOTT 3000 ANALYST
    FORD 3000 ANALYST


     

    6)從一個表中查找另一個表中沒有的值

    比如要從DEPT中查找在表EMP中不存在數據的所有部門(數據中,DEPTNO值為40的記錄在表EMP中不存在)

    1select deptno from dept   
    2minus   
    3select deptno from emp 


     

    7)在運算和比較時使用null值

    null不會等于和不等于任何值,null和自己都不等于。以下例子是當comm有null的情況下列出比“WARD”提成低的員工。 (coalesce函數將null轉換為其他值)

    1select ename,comm,coalesce(comm,0)   
    2  from emp   
    3where coalesce(comm,0< ( select comm   
    4                                     from emp   
    5                                    where ename = 'WARD' )


    ENAME COMM COALESCE(COMM,0)
    ---------- ---------- ----------------
    SMITH 0
    ALLEN 300 300
    JONES 0
    BLAKE 0
    CLARK 0
    SCOTT 0
    KING 0
    TURNER 0 0
    ADAMS 0
    JAMES 0
    FORD 0
    MILLER 0

     

    8)刪除重復記錄

    對于名字重復的記錄,保留一個

    1delete from dupes   
    2 where id not in ( select min(id)   
    3                      from dupes   
    4                     group by name ) 

     

    9)合并記錄
    比如如下需求:
    如果表EMP_COMMISSION中的某員工也存在于EMP表,那么更新comm為1000
    如果以上員工已經更新到1000的員工,如果他們SAL少于2000,刪除他們
    否則,從表中提取該員工插入表EMP_COMMISSION

    1merge into emp_commission ec   
    2using (select * from emp) emp   
    3    on (ec.empno=emp.empno)   
    4 when matched then  
    5       update set ec.comm = 1000   
    6       delete where (sal < 2000)   
    7 when not matched then  
    8        insert (ec.empno,ec.ename,ec.deptno,ec.comm)   
    9       values (emp.empno,emp.ename,emp.deptno,emp.comm)  

     

    10)用sql生成sql

    1select 'select count(*) from '||table_name||';' cnts   
    2  from user_tables;   


    (user_tables是oracle的元數據表之一)

    CNTS
    ----------------------------------------
    select count(*) from ANT;
    select count(*) from BONUS;
    select count(*) from DEMO1;
    select count(*) from DEMO2;
    select count(*) from DEPT;
    select count(*) from DUMMY;
    select count(*) from EMP;
    select count(*) from EMP_SALES;
    select count(*) from EMP_SCORE;
    select count(*) from PROFESSOR;
    select count(*) from T;
    select count(*) from T1;
    select count(*) from T2;
    select count(*) from T3;
    select count(*) from TEACH;
    select count(*) from TEST;
    select count(*) from TRX_LOG;
    select count(*) from X;

     

    11)計算字符在字符串里的出現次數

    判斷字符串里有多少個‘ , ’

    1select (length('10,CLARK,MANAGER')-   
    2  length(replace('10,CLARK,MANAGER',',','')))/length(',')   
    3  as cnt   
    4from t1   


    先計算原字符串長度,再減去去掉逗號的長度,這個差再除以‘,’的長度

     

    12)將數字和字母分離


    原數據是:

    DATA
    ---------------
    SMITH800
    ALLEN1600
    WARD1250
    JONES2975
    MARTIN1250
    BLAKE2850
    CLARK2450
    SCOTT3000
    KING5000
    TURNER1500
    ADAMS1100
    JAMES950
    FORD3000
    MILLER1300
     1select replace(   
     2  translate(data,'0123456789','0000000000'),'0') ename,   
     3  to_number(   
     4    replace(   
     5    translate(lower(data),   
     6      'abcdefghijklmnopqrstuvwxyz',   
     7      rpad('z',26,'z')),'z')) sal   
     8  from (   
     9    select ename||sal data from emp   
    10 )   

    ENAME SAL
    ---------- ----------
    SMITH 800
    ALLEN 1600
    WARD 1250
    JONES 2975
    MARTIN 1250
    BLAKE 2850
    CLARK 2450
    SCOTT 3000
    KING 5000
    TURNER 1500
    ADAMS 1100
    JAMES 950
    FORD 3000
    MILLER 1300

    思路是很復雜的,比如先去除數字,是先把所有數字翻譯為0,然后用replace去掉0.


     

    13)根據表中的行創建分割列表


    表中數據:
    DEPTNO EMPS
    ------ ----------
    10 CLARK
    10 KING
    10 MILLER
    20 SMITH
    20 ADAMS
    20 FORD
    20 SCOTT
    20 JONES
    30 ALLEN
    30 BLAKE
    30 MARTIN
    30 JAMES
    30 TURNER
    30 WARD

     1select deptno,   
     2    ltrim(sys_connect_by_path(ename,','),',') emps   
     3  from (   
     4  select deptno,   
     5    ename,   
     6    row_number() over   
     7       (partition by deptno order by empno) rn,   
     8    count(*) over   
     9      (partition by deptno) cnt   
    10  from emp   
    11  )   
    12  where level = cnt   
    13  start with rn = 1   
    14    connect by prior deptno = deptno and prior rn = rn-1 


    查詢結果
    DEPTNO EMPS
    ------- ------------------------------------
    10 CLARK,KING,MILLER
    20 SMITH,JONES,SCOTT,ADAMS,FORD
    30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES

     

    14)按字母順序排序

     1select old_name, new_name   
     2  from (select old_name, replace(sys_connect_by_path(c, ' '), ' ') new_name   
     3          from (select e.ename old_name,   
     4                       row_number() over(partition by e.ename order by substr(e.ename, iter.pos, 1)) rn,   
     5                       substr(e.ename, iter.pos, 1) c   
     6                  from emp e, (select rownum pos from emp) iter   
     7                 where iter.pos <= length(e.ename)   
     8                 order by 1) x   
     9         start with rn = 1   
    10        connect by prior rn = rn - 1   
    11               and prior old_name = old_name)   
    12 where length(old_name) = length(new_name) 


    You would like the result to be:

    OLD_NAME NEW_NAME
    ---------- --------
    ADAMS AADMS
    ALLEN AELLN
    BLAKE ABEKL
    CLARK ACKLR
    FORD DFOR
    JAMES AEJMS
    JONES EJNOS
    KING GIKN
    MARTIN AIMNRT
    MILLER EILLMR
    SCOTT COSTT
    SMITH HIMST
    TURNER ENRRTU
    WARD ADRW

     

    posted @ 2008-08-07 14:41 方佳瑋 閱讀(2768) | 評論 (6)編輯 收藏

    答辯后,心理有很多話要說,真是很不爽,也為中國軟件業的未來捏一把汗。如果此文讓某些讀者感覺不爽,就當沒看過,在此先向你道歉。
     
    本周5是我們計算機專業畢業設計答辯日,我提前4天來到學校,帶著3月份早就完成的畢業設計。真是讓我大吃一驚,很多同學竟然都下載或者花錢買了畢業設計或者找人幫忙做來交差,這個數量我估計至少有5成。我的一個好友,更是夸張,什么都沒做,要我幫他在2天內搞定,我慌了,真把我當超人了,不過還好,由于她那個東西確實沒什么內容,我趕了一下還是幫她搞定了,實在是沒啥內容的畢業設計。最搞笑的是還有些同學。。。,由于不是自己做的東西,而且連代碼也看不懂,運行出錯都不知如何解決,只會找別人求助,還天真地說:奇怪,怎么不行呢?原來明明看到可以運行的。。。。 我要他自己去debug一下,結果,連開發工具也沒用過,怎么在開發工具里跑一個工程debug也根本不會,我再次無話可說。
     
    同學們啊,你們不是高中生,你們是重點大學計算機專業應屆畢業生啊,怎么就像沒讀過大學一樣,你們到底在4年里干了什么啊。
     
    然后更讓人心寒的是:答辯時,很多老師都自己什么也不會,或者只會皮毛,看著同學的畢業設計,除了問點需求問題,再也問不出任何技術問題了,最后就草草答辯完,給個分數就算過了。我在答辯時,也懶得把架構和技術應用來說了,實在是對牛彈琴。學生墮落,教師應付,學校亂搞擴招,公司高薪招不到人才,中國軟件業的未來有何希望!
     
    當然,還是有10%左右的學生很優秀,有些做了很不錯的java ee程序,有些自己研究做了簡易3D游戲引擎,還有些同學水平不怎么樣,但通過自己努力獨立完成了,雖然做得不怎么好,但學到很多東西,也是自己勞動汗水,但是這些同學太少太少。。。
    posted @ 2007-06-18 15:43 方佳瑋 閱讀(1614) | 評論 (6)編輯 收藏

    選自《Professional Javascript For Web Developers》

    其它方式:對象冒充,call(),apply(),原型鏈都有不少缺點這里就不一一介紹了,想了解的可以去看一下這本著作的第4章節。

    這種方法用對象冒充繼承屬性,用原型鏈繼承方法,代碼如下
    function ?ClassA(sColor){
    ????
    this .color? = ?sColor;
    }

    ClassA.prototype.sayColor?
    = ? function (){
    ????alert(
    this .color);
    }

    function ?ClassB(sColor,?sName){
    ????ClassA.call(
    this .?sColor);
    ????
    this .name? = ?sName;
    }

    ClassB.prototype?
    = ? new ?ClassA();

    ClassB.prototype.sayName?
    = ? function (){
    ????alert(
    this .name);
    }

    測試:
    var ?objA? = ? new ?ClassA( " red " );
    var ?objB? = ? new ?ClassB( " blue " ,? " Nicholas " );
    objA.sayColor();?
    // red
    objB.sayColor();? // blue
    objB.sayName();?? // Nicholas

    其它好方法,請參考zlnherit庫和xbObjects
    posted @ 2007-03-03 15:44 方佳瑋 閱讀(1365) | 評論 (0)編輯 收藏

    1.有個大大提高性能的建議:

    比如得到list 是5個班級,然后要得到5個班級的所有學生

    垃圾辦法:5次通過級聯獲得,等于執行5條sql語句

    好辦法:

    this .getSession().createQuery(
    ????????
    " from?User?a,Clazz?b?where?a.clazz=b?and?b?in(:clazz) " )
    ?.setParameterList(
    " clazz " ,?list)
    ?.list();

    僅執行一條


    2.還有個很實用的方法,如何通過hql語句返回多個po

    List?list? = ? this .getSession().createQuery(
    ?
    " from?User?a,Clazz?b?where?a.clazz=b " ).list();

    // 使用的時候:
    Iterator?it? = ?list.iterator();
    ??
    while (it.hasNext()){
    ?Object[]?vo?
    = ?(Object[])it.next();
    ?User?user?
    = ?(User)vo[ 0 ];
    ?Clazz?clazz?
    = ?(Clazz)vo[ 1 ];
    ?System.out.println(user.getUserName()?
    + ? " , " ? + ?clazz.getClassName());
    }?


    3.我們全部用一對一,多對一等。如果過濾有問題,有個辦法

    List?students? = ? this .getSession().createFilter(clazz.getStudents(), " where?this.status='A' " ).list();?
    posted @ 2007-02-14 23:30 方佳瑋 閱讀(488) | 評論 (0)編輯 收藏

    選自《Professional Javascript For Web Developers》

    其它方式:工廠方式,構造函數方式,原型方式都各有各的大缺陷,這里就不一一介紹了,想了解的可以去看一下這本著作的第3章節。

    1. 混合構造函數/原型方式

    function ?Car(sColor,?iDoors,?iMpg)?{
    ??
    this .color? = ?sColor;
    ??
    this .doors? = ?iDoors;
    ??
    this .mpg? = ?iMpg;
    ??
    this .drivers? = ? new ?Array(“Mike”,?“Sue”);
    }

    Car.prototype.showColor?
    = ? function ?()?{
    ??alert(
    this .color);
    };

    var ?oCar1? = ? new ?Car(“red”,? 4 ,? 23 );
    var ?oCar2? = ? new ?Car(“blue”,? 3 ,? 25 );

    oCar1.drivers.push(“Matt”);

    alert(oCar1.drivers);?
    // outputs?“Mike,Sue,Matt”
    alert(oCar2.drivers);? // outputs?“Mike,Sue”

    優點:具有其它方式的優點而沒有其它方式的缺點
    不足:封裝性欠缺

    2 . 動態原型方式

    function ?Car(sColor,?iDoors,?iMpg)? {
    ??
    this .color? = ?sColor;
    ??
    this .doors? = ?iDoors;
    ??
    this .mpg? = ?iMpg;
    ??
    this .drivers? = ? new ?Array(“Mike”,?“Sue”);

    ??
    if ?( typeof ?Car._initialized? == ?“undefined”)? {
    ????Car.prototype.showColor?
    = ? function ?()? {
    ??????alert(
    this .color);
    ????}
    ;

    ????Car._initialized?
    = ? true ;
    ??}

    }


    優點:封裝性比上一個方式更好
    不足:就是看上去奇怪一點,呵呵


    總之,以上2種方式是目前最廣泛使用的,盡量使用它們避免不必要的問題。

    posted @ 2007-02-11 17:34 方佳瑋 閱讀(6166) | 評論 (1)編輯 收藏

    v0.9 點擊下載

    有些錯別字,我會在以后版本更正

    花了幾周把DWR中文文檔.PDF給搞出來了

    這是首次發布在網上

    希望對大家有用

    有任何意見請發我郵箱:jorwen.fang@gmail.com,或者在此留言

    第一版目錄預覽:

    第1章. DWR入門 8
    1.1 簡介 8
    1.2 第一個DWR程序:Hello World 9
    1.2.1 將DWR放入你的工程 9
    1.2.2 編輯配置文件 9
    1.2.3 編寫service 10
    1.2.4 測試DWR 10
    1.2.5 編寫一個jsp 11
    1.3 本章總結 12

    第2章. web.xml配置 13
    2.1 主要配置 13
    2.2 常用<init-param>參數列表 14
    2.2.1 安全參數 14
    2.2.2 Ajax服務器加載時保護參數 14
    2.2.3 其他參數 15
    2.3 日志配置 16
    2.4 多個dwr.xml配置和J2EE角色定義 16
    2.5 插件配置 18
    2.6 測試模式配置 19

    第3章. dwr.xml配置 20
    3.1 縱覽 20
    3.2 <init>標簽 20
    3.3 <allow>標簽 21
    3.3.1 Creator 21
    3.3.2 Converter 25
    3.4 <signatures>標簽 30

    第4章. 整合 32
    4.1 DWR與Servlet 32
    4.1.1 使用webContext的方法: 32
    4.1.2 方法選擇 32
    4.2 DWR與Spring 34
    4.2.1 讓DWR和Spring一起工作的檢查列表 34
    4.2.2 Spring Creator 34
    4.2.3 找到Spring配置文件 34
    4.2.4 使用Spring配置DWR 35
    4.3 DWR與JSF 36
    4.3.1 JSF Creator 36
    4.3.2 Servlet Filter 36
    4.4 DWR與Struts 37
    4.4.1 Struts creator 37
    4.4.2 開始順序 37
    4.5 DWR與Weblogic或PageFlow 38
    4.6 DWR與Hibernate 39
    4.6.1 讓DWR和Hibernate一起工作的檢查列表 39
    4.6.2 HibernateBeanConverter 39
    4.6.3 Session管理 39
    4.7 DWR與WebWork 40
    4.7.1 配置dwr.xml 40
    4.7.2 在JSP中導入腳本 40
    4.7.3 高級 41
    4.8 DWR與Acegi 42
    4.8.1 問題提出 42
    4.8.2 解決方案 42

    第5章. DWR中的JavaScript簡介 44
    5.1 簡單的回調函數 44
    5.2 調用元數據對象 45
    5.3 查找回調函數 45
    5.4 創造一個與Java對象匹配的Javascript對象 46

    第6章. engine.js 功能 47
    6.1 使用選項 47
    6.2 選項索引 48
    6.2.1 處理器(Handler) 48
    6.2.2 調用處理器(Call Handler) 48
    6.2.3 Hooks (一個batch中可以注冊多個hook) 49
    6.2.4 全局選項(在單次調用或者批量調用中不可用) 49
    6.2.5 廢棄的選項 49
    6.2.6 未來版本的選項 49
    6.3 選項說明 50
    6.3.1 批量調用 50
    6.3.2 順序調用 50
    6.3.3 錯誤警告和超時 50
    6.3.4 遠程調 Hooks 51
    6.3.5 遠程調用選項 51

    第7章. util.js 功能 54
    7.1 $() 54
    7.2 addOptions and removeAllOptions 54
    7.3 addRows and removeAllRows 55
    7.4 getText 56
    7.5 getValue 56
    7.6 getValues 57
    7.7 onReturn 57
    7.8 selectRange 57
    7.9 setValue 58
    7.10 setValues 58
    7.11 toDescriptiveString 58
    7.12 useLoadingMessage 58
    7.13 Submission box 61

    第8章. DWR進階 63
    8.1 DWR  Annotations 63
    8.1.1 初始配置 63
    8.1.2 遠程訪問類 63
    8.1.3 對象轉換 64
    8.2 錯誤和異常處理 64
    8.2.1 錯誤處理 64
    8.2.2 異常 65
    8.2.3 找出更多的信息 65
    8.3 傳遞額外的數據到callback函數 66
    8.4 從其他的URL讀取數據 67
    8.5 安全 68

    第9章. 范例精講 71
    9.1 購物車 71
    9.1.1 介紹 71
    9.1.2 實現目錄 72
    9.1.3 測試部署 74
    9.1.4 調用遠程對象 75
    9.1.5 實現購物車 77
    9.1.6 調用遠程的 Cart 方法 79
    9.1.7 演示結果 81
    9.1.8 總結 81

    第10章. 附錄 83
    10.1 常見問題 83
    10.1.1 TransformerFactoryConfigurationError 83
    10.1.2 XML解析錯誤 83
    10.1.3 使用weblogic的類路徑問題 83
    10.1.4 沒有cookies的情況下用DWR 84
    10.2 JavaScript高級應用 85
    10.2.1 用變量操縱函數 85
    10.2.2 高階函數 86
    10.2.3 動態類型 87
    10.2.4 靈活的對象模型 89
    10.2.5 本節總結 91

    posted @ 2007-02-08 20:18 方佳瑋 閱讀(7623) | 評論 (49)編輯 收藏

    曾經看過一項統計,在大連有95%以上的軟件公司都是軟件外包的公司,準確的說:是面向外國開發的軟件公司。這種現象不單單只出現在大連,現在北京,上海包括深圳也有很多對日開發的外包公司,只是數量上不象大連那么明顯罷了。
    ??? 我看到很多程序員都在討論外包的利弊,在這里我只談談自己的觀點:
    ??? 1:曾經問過許多大連軟件行業的朋友,大部分人都抱怨自己的工作時間長,工資待遇不高,而且工作技術含量不高,感覺學不到什么新東西。用一句網友的話來形容:“軟件外包,豐富了老板的腰包,犧牲了程序員的青春”。工作將近三年,我的感受也是如此。外包就是這個樣子:內部設計是外國人做的,我們需要做的只是按照人家的式樣書,把偽代碼經過枯燥無味的反復調試工作變成可以正常運行的程序。測試也是如此,我們只需要負責單體測試就足夠了。大部分測試工作:連接測試,綜合測試,壓力測試統統移到外國去做。這就是大部分軟件外包公司的現狀。學過軟件工程的人都應該深深的知道一點:在軟件開發的過程主要由設計,代碼,測試三部分組成。對應這三部分,合理的安排開發時間是非常必要的,往往我們項目是這樣安排的,3:1:2,也就是說設計需要的時間是代碼部分的三倍,測試部分是其2倍(單體測試應該和代碼整合成一個部分)。按這個比例計算,如果整個項目的資金為60萬,做程序員的最多能分到10萬,而公司中人數最多的也是程序員。這樣我們就可以理解為什么如此多的程序員在抱怨工資低了。至于技術含量的問題,我想應該這么理解:不是我們做的項目缺少技術含量,而是技術含量高的部分絕大多數都是由日本鬼子完成的,外國人看中了中國廉價的勞動力市場,才把這些技術含量低的部分拿到中國來做。而外國人也絕不會把技術精髓的部分拿到中國來做。

    ??? 2:上面說到外包的那么多缺點,我們不做總可以了吧?但為什么還有那么多的人樂此不彼呢?原因大概有這么兩點:中國的軟件產業從98年開始茁壯的開始成長,到2001已經發展的很火爆,仔細想想當時97屆的計算機畢業生(2001年畢業),基本上沒畢業就找好工作了,沒找到工作的只是寥寥幾人,可以想象當時的計算機行業相當紅火。可2002年隨著全球IT產業的不景氣,中國的軟件行業已經逐漸走下坡路,很多軟件公司倒閉,破產。也就是說,現在的軟件行業不好做了,最起碼不如以前了。在這種情況下,合理的利用外來資產來發展壯大中國的軟件行業也不失為一種對策。還有一個原因:我國的軟件行業屬于起步比較晚,經驗和人才相對匱乏,和日本等發達國家合作,可以為我們培養出很多高水平的管理和開發人員。曾經問過一些在北京工作的軟件開發人員,他們通常寫代碼不寫注釋,也用不寫軟件開發的相關文檔。試想這樣的軟件產品的質量能放心的了么?而在外包公司,這種現象是根本不能發生的。即使,技術含量再低的工作,內部設計書,詳細設計書,單體測試報告…這都是不可缺少的產品的一部分,而且國外公司對這些文檔的要求都是比較嚴格的。做任何事情都要按著一定的規范來做,雖說有些繁瑣,但對于沒有太多經驗的程序員來說,書寫技術文檔對其事業發展是很有好處的,也是非常有必要的。

    ????? 總體來說,軟件外包有利有弊。我認為對我國目前軟件產業不太成熟的現狀來說,軟件外包的利大于弊。做任何事業總要付出犧牲,而中國軟件事業犧牲的確是我們這一代程序員。
    posted @ 2006-10-03 12:42 方佳瑋 閱讀(1182) | 評論 (2)編輯 收藏

    作者:崔啟亮, 原始出處:軟件質量研究網www.sqstudy.org?
    目前已經進駐上海的知名全球服務外包企業包括埃森哲、優利、NCS、博朗、愛特優科等

    目錄:
    [0] - 為什么要對大學生談軟件外包?
    [1] - 什么是軟件外包?
    [2] - 軟件為什么要外包?
    [3] - 為什么要承接軟件外包
    [4] - 做軟件外包有前途嗎?
    [5] - 外包公司是怎么工作的?
    [6] - 有哪些好的外包公司?

    [7] - 軟件外包公司需要什么樣的人?
    [8] - 哪些人不適合做軟件外包技術人員?
    [9] - 如何通過軟件外包公司的面試?


    [0] - 為什么要對大學生談軟件外包?

    中國軟件外包行業這幾年成為發展最為迅速的行業之一,無論你是在校的大學生,還是即將畢業的同學,都有必要了解這個行業。如果你是軟件相關專業的同學,或者畢業后準備從事軟件行業,那么更應該關注軟件外包這個行業。

    盡管網上已經有很多關于軟件外包的信息,但是這些信息很多都是媒體記者的報道,他們只是從旁觀者的角度看待軟件外包,缺乏一定的深度和實踐感受。還有一些來自非軟件外包的人士,基于他們主觀的理解和推測,認為軟件外包是很低級的工作,為軟件外包工作潑冷水,影響了對軟件外包工作的正確認識,造成了軟件外包的“中國式誤會”。

    大學生接受了系統的高等教育,具有牢固的知識基礎,而且具有極強的可塑性和學習能力,是未來軟件外包行業的主力軍。但是,他們參加軟件外包實際項目的機會和經驗畢竟很少,對于軟件外包有很多模糊的認識。由于教材的更新需要更長的周期,高校教師如果沒有豐富的外包企業經驗,很難把軟件外包的實際知識傳授給學生,因此,外包企業從業人員有必要向這些高校學生交流一些軟件外包企業的實際情況。

    那么什么是軟件外包?軟件為什么要外包?中國軟件外包的現狀如何?將來做軟件外包是否有前途?這些問題可能很多同學不是很清楚,如果今后打算進入這個行業,則從現在開始就需要先了解這些問題的答案。

    筆者具有多年的軟件外包公司工作經驗,對于軟件外包行業一直積極關注,并且積極與國內外同行交流,對軟件外包有些自己的體會,借此機會與個位同學進行交流。


    ?[1] - 什么是軟件外包?

    軟件外包就是軟件開發商(簡稱“發包方”)將軟件開發的一部分或者全部,發給別的軟件公司(簡稱“接包方”)去完成。

    我們通常說的中國外包公司很多都是“接包方”,主要從日本和歐美等國承接軟件外包項目的技術工作。現在軟件行業比較發達的美國、歐洲和日本是最大的“發包方”市場。

    由于軟件外包是軟件全球性生產方式,所以存在很多關于外包的英文術語。外包的英文單詞是“Outsourcing”。站在“發包方”的角度,把“接包方”成為“Vendor(外包服務商)”。站在“接包方”角度,把“發包方”成為“Client(客戶)”

    軟件外包與其他外包其實沒有本質區別,就是雙方合作把一個很復雜的、較大的軟件項目分工合作,共同做好。其實在其他行業,外包已經實施了很長時間,例如汽車行業,生產汽車的公司(比如一汽集團)他們先設計好汽車的結構,完成主要部件的生產,把很多零件外包給很多廠家加工,然后采用完成整個車輛的安裝和制造。

    現在人們很關注軟件外包,就是因為外包在軟件行業應用的時間還很短,而且軟件生產存在很多不可見因素,軟件外包的優勢和好處,還沒有被普遍了解和感受。

    總結一句話,軟件外包就是軟件生產的分工和合作,主要目標就是生產出好的軟件。


    [2] - 軟件為什么要外包?

    同學們可能都聽說了,現在印度和中國做軟件外包“火得不得了”,越來越多的歐美大型軟件公司都把軟件外包給印度和中國。為什么會出現這種現象呢?

    要回答這個問題,不能簡單的從發包方或者接包方一個方面尋找答案。因為“一個巴掌拍不響”,要實現軟件外包,必須雙方都有需求、有能力、愿合作才行。而且不能把目光只盯在中國一個國家,還需要從全球軟件行業的整體來看待和理解。

    為什么軟件外包能發展的這么快呢?主要原因在于通過軟件外包,發包方和接包方都獲得了可觀的利益,非常具有現實意義。說得更簡單一點,就是雙方都獲得了好處,大家是互相合作的伙伴。

    作為發包方,可以獲得下列好處:

    • 降低軟件項目成本
    • 提高軟件質量
    • 縮短軟件開發周期

    怎么理解軟件外包能較低軟件項目成本呢?

    大家可能聽說過,美國的軟件技術人員的工資比中國同等水平的人員要高5到10倍,所以不少美國的軟件開發公司都把軟件開發和測試的工作,發到中國的軟件外包公司來作,可以大幅度的降低成本。對于中國的軟件外包公司,他們從國外客戶承接外包項目,可以獲得很穩定也很好的項目價格,所以很樂意做軟件外包服務商(Vendor)。

    說到通過軟件外包提高軟件質量,可能很多人不理解。舉個例子就明白了。

    美國微軟(Microsoft)公司是全球最大的軟件公司,現在正在開發的Windows Vista新操作系統,需要同時發布多個語言的本地化軟件,例如英語、簡體中文、繁體中文、日語、韓語、德語、法語、阿拉伯語等。這些語言的本地化版本的翻譯、編譯、測試,如果全部在微軟公司內部完成,那么微軟需要招聘大量的精通每種語言和軟件技術的工程師,否則語言質量肯定不能保證。如果把這些工作外包給專業的軟件本地化外包公司,軟件本地化是這些外包公司的強項,所以可以顯著的提高軟件質量。

    軟件外包能縮短軟件開發周期的道理很容易理解,如果很復雜的軟件開發工作都在一個公司內部完成,那么可能耗費1年甚至幾年的時間。例如,如果Microsoft Windows Vista的軟件需求分析、框架設計、詳細設計、軟件編碼、軟件測試、軟件多語言本地化等工作都在Microsoft公司內部實現,那么微軟可能需要招聘很多的內部員工,動用很多的項目經理管理這些人員,對這些人員進行技術、語言和流程培訓,花費的時間肯定比外包更長。這樣的軟件即使開發出來了,等到能夠發布這些技術可能過時了,其他競爭對手的相似產品肯定已經早已占領了市場。

    現在是網絡信息時代,時間就是金錢,速度就是效益,“快魚吃慢魚”,實現搶先推出新產品,誰就可能占領更多的市場份額。


    [3] - 為什么要承接軟件外包?

    前面提到了軟件開發商通過軟件外包,可以達到降低軟件成本、提高軟件質量和縮短開發周期的好處,所以大型軟件開發商很愿意把軟件的一部分工作外包給專業的軟件外包公司。

    那么軟件外包公司為什么愿意從事這種接包工作呢?

    我們可以從以下幾個方面分析這個問題。

    • 承接軟件外包工作可以獲得穩定的、較高的利潤
    • 承接軟件外包可以學習軟件的先進技術和管理方法
    • 承接軟件外包可以加速企業國際化步伐

    下面對這幾點進一步說明。

    軟件外包的接包方都是人力成本較低的國家和地區,例如中國和印度的軟件開發和測試工程師的平均工資比歐美同等級別的人員要便宜很多。這樣看來即使發包方發來的外包項目的價格不很高,但是對于這些國家的外包公司看來,還是價格很高的。

    通過舉個實際的例子來算算“經濟帳”,假設美國軟件公司發給中國軟件外包公司做軟件測試的項目,按照沒個測試工程師每小時15美元計算,每天8小時公司可以獲得120美元。每個月按照22天計算,外包公司可以從每個測試工程師獲得120*22=2640美元。如果按照1美元=8人民幣元計算,是21120人民幣元。一般軟件外包公司發給員工的工資大約4000到8000人民幣元,另外除去運營成本和各種稅費,外包公司獲得的純利潤高于15%到20%。

    15%到20%的純利潤是個什么程度?熟悉中國軟件開發行業的同學可能知道,由于中國開發的通用軟件受到盜版的影響,利潤非常少,甚至無法收回投資。另外,中國軟件行業競爭太激烈了,經常為了投一個“招標項目”,大家靠拉關系,拼價格,即使最后搶到這個項目,價格已經很低了,再加上內部開發成本逐年上升,經常是項目做完了,所賺無幾,甚至賠錢。2005年中國軟件開發行業的利潤整體下滑,有媒體報道說降到了5%。一般企業正常發展的凈利潤應該高于11%,否則生存就有了問題,更別談什么發展了。

    承接軟件外包可以學習軟件的先進技術和管理方法。軟件發包方都是較為成熟的大型國際化軟件公司,他們在技術和管理上積累了成功的流程和方法。對于中國軟件公司,很多還停留在100人以下的小規模,很少具有開發和管理大型國際化軟件的經驗,也沒有這方面的整體實力。通過承接大型軟件公司的外包項目,可以鍛煉隊伍,學習各種開發和測試技術、項目流程規劃,項目管理等多方面的技術。其實印度規模較大的外包公司,塔塔咨詢(TCS),InfoSys等最早也是從承接美國的軟件外包測試開始的,現在都超過了5萬人,現在可以承接大型軟件的咨詢和設計任務,在美國市場上直接和IBM、HP等大型公司正面競爭。

    承接軟件外包可以加速企業國際化步伐。企業國際化是現在中國企業喊的最多的口號,但是真正成功實現了國際化的中國企業還不多。多年來缺乏與國外的交流,中國人的頭腦形成了很多僵化的意識。承擔軟件外包項目,可以與國外客戶直接交流,學習行業國際規則,維持良好的國際客戶關系,了解國外市場的現狀,為將來企業進軍國際化做好物質和市場準備。

    正是基于承接軟件外包的種種好處,國內很多的軟件公司紛紛加入軟件外包測試的大軍,大家就像發現了新的金礦,樂詞不彼,準備大干一場。甚至某些以開發產品或專業服務為主的公司,例如用友、東軟和神州數碼都加大了承接外包項目的力度。

    有消息稱,在未來2年內,中國的軟件外包公司將到納斯達克上市,成為新的中國外包概念股。


    ?[4] - 做軟件外包有前途嗎?

    俗話說:“男怕入錯行”,如果你進入了一個沒有前途的行業,即使你的能力再高,你的發展空間也很有限。對于,剛剛畢業的大學生,第一份工作非常重要,甚至會影響一生的職業生涯。

    軟件外包是全球軟件行業新興的行業,是經濟全球化和軟件產業全球分工的產物。大家知道全球化已經深入到我們生活的每個方面,我國的改革開放就是順應了時代潮流。

    對于中國而言,軟件外包的發展更是如火如荼,屬于典型的IT“朝陽行業”。每年的增長速度都在50%以上,特別對于中國的軟件外包公司,他們每年的業務都是100%的速度增長,發展勢頭不可阻擋。

    從事軟件外包工作的好處之一是可以在短期內獲得職業提升的機會。現在中國軟件外包行業如果具有5年以上的工作經驗,就可以成為外包的有經驗專才了。很多大學生進入軟件外包公司工作2到3年,如果學習能力和交流能力好,可以成為項目經理或者部門經理。

    從事軟件外包工作的好處之二是可以學習和培養國際化思維方式和工作方式。前面已經談到,軟件外包是全球合作的工作方式。做軟件外包工作,有機會學習先進的軟件設計和測試方法,學會管理大型的、多個團隊協作的軟件項目,要和多個國家和地區的技術人員和管理人員進行英語或者日語交流。這樣可以提高語言表達能力,團隊交流能力,遵守科學的生產流程,成為熟悉國際市場和技術的職業人士,對于將來的職業發展大有幫助。

    而如果畢業后到一個小的軟件公司工作,由于中國的小軟件公司很多都是10多個或者幾十個人的手工作坊式公司,企業內部缺乏完善的流程,管理混亂,粗放式經營,依靠個別高手的能力,這樣的環境很不容易學習到關鍵技術,而且還會養成隨意的、不善交流的獨立自我的工作習慣。這種習慣一旦養成對于今后的職業發展是大為不利的。

    因此,大學畢業生投身做軟件外包,就是進入了一個發展前途十分可觀的“朝陽行業”,通過自身的不斷努力,有希望在短期內,成為熟悉國際化行業規則的技術和管理人才,成為職場上非常有競爭力的軟件專家。


    [5] - 外包公司是怎么工作的?

    進入軟件外包企業后,為了盡快適應新環境,完成日常工作,需要了解軟件外包公司是如何安排工作的。

    從外包的內容看,現在大多數中國軟件外包公司從事兩種內容的工作,第一是軟件設計和編碼的外包(即開發外包),第二類是軟件測試外包。

    從工作的地點看,軟件外包公司的員工的工作形式分為兩種,第一是被派遣到發包方(客戶)的公司進行工作,這種形式稱為“On-site外包”。第二式在軟件外包公司內部工作,稱為“In-house外包”。

    如果同學們到人才招聘網站看看外包公司的招聘廣告,經常能看見赴微軟,赴IBM從事軟件開發或測試的招聘職位。這種形式就是“On-site外包”。舉個例子,軟件外包公司A招聘了從事軟件外包測試的同學小李到微軟亞洲工程院從事微軟的軟件測試,雖然小李在微軟的公司工作,但是他隸屬于A公司,工作上受到A公司和微軟公司的領導,A公司每個月按照A公司的工資標準給小李發工資。一般來說,“On-site外包”的工程師的技術水平要求的更高些。

    在筆者看來,“On-site外包”工作方式只是軟件外包的初級形式,如果軟件外包的服務模式成熟之后,越來越多的外包將以“In-house外包”的形式實現。下面介紹“In-house外包”的工作方式。

    所有的軟件外包公司都是以“項目”的形式,組建項目團隊開展外包工作。一個“項目”就是一個有著明確的任務,明確的開始和結束時間,以及明確的質量要求的工作。項目團隊就是為了完成一個項目組建的有不同角色的多個人的小組,一般安排一個項目經理,一個或幾個組長,多個工程師。

    項目經理主要制定項目計劃、資源安排、內部交流和外包的客戶交流。組長為每個工程師分結和安排具體的任務,跟蹤項目進度,解決技術問題。工程師根據組長分配的任務按照進度和質量完成每天的工作,并且報告進展和遇到的問題。

    項目經理負責周期性的向“客戶”報告項目進展情況,同時把客戶反應的問題和來自客戶的最新文件和要求等傳達給項目組。

    通常項目經理和組長都是由具有管理和技術經驗的員工擔任,對于剛剛加入軟件外包公司的大學生來說,絕大多數都是從工程師的職位做起的,先經過外包公司的內部培訓,然后進入項目組實習,轉正之后稱為工程師,負責具體的開發或測試工作。

    順便說說,不少優秀的大學生,專業技術非常好,學習能力由特別強,善于思考和總結,也善于與其他人交流和合作,這樣的學生很快就可以在項目團隊中脫穎而出,經過一年或者兩年可以從普通工程師晉升到測試組長甚至項目經理。我的不少同事就是這樣過來的,這是因為軟件外包發展得非常快,客戶發來的軟件外包項目越來越多,項目團隊越來越多,每個項目都需要項目經理,所以從事軟件外包具有很大的職業發展空間。

    現在總結一下軟件外包公司的工作方式:

    • “On-site外包”或者“In-house外包”方式
    • 按照項目團隊的方式工作
    • 剛進入外包公司的大學生絕大多數要從工程師做起


    ?[6] - 有哪些好的外包公司?

    對于正在找工作的同學來說,都希望到一個規模較大的公司工作,一般來說,大公司比較規范,待遇也較高,倒閉的風險小。對于軟件外包公司來說也是這樣子。

    同學們可以猜猜看,全球著名的高端軟件外包公司有哪些?據媒體報道,比較公認的全球高端外包公司分別是IBM,HP和EDS,前兩家同學們肯定耳熟能詳,有些同學可能懷疑IBM,HP能算是軟件外包公司嗎?它們算不算外包公司不是我說的,反正做軟件外包多年的老外都這么人為,人家可是全球知名的外包專家,可不是信口胡說的呀。

    有的同學經常問我,國內有哪些規模較大的外包公司?哪個外包公司最好?我一般都回答不好。為什么呢?因為每個人看問題的角度不同。比如,什么是“規模較大”?是按照正是員工的人數比較呢還是按照每年的總收入確定?什么樣的外包公司是“好公司”?給員工發的工資搞就是好公司嗎?給員工提供專業的技術培訓,而且具有很大的職業發展空間的是否就是“好公司”呢?

    因此,在你問這些問題前,先要搞清楚你心目的好公司應該具有什么樣的特征。

    我還是從國內外包公司的普遍特征來給出這個問題的一些參考信息。

    前面已經提到,我國軟件外包公司屬于新興的行業,真正從事軟件外包的員工如果人數超過1000人在中國就可以算是比較大的外包公司了。據了解國內最大人數的外包公司現在不超過3000人(這里需要說明一點,有些公司一開始是做系統集成的,最近才開始做軟件外包業務,雖然他們的全體員工超過5000人,但是真正做軟件外包的還不超過3000人)。所以同印度的某些大的軟件外包公司項目,我國的軟件外包公司規模普遍弱小。印度的軟件外包公司超過10000人的很多,有些超過了5萬人。所以有些國內的軟件外包的朋友,把中國軟件外包公司比作“螞蟻”,把印度外包公司比作“大象”。

    如果同學們打算做軟件外包,肯定要問哪個省市的軟件外包公司最多?我要告訴大家的是,中國的軟件外包在各個省市的發展很不平衡。大連、北京、上海、深圳、蘇州、西安等發展的相對快些。其他各個地方今年開始從政府到企業都開始提出要發展軟件外包了。

    關于國內軟件公司的規模,同學們可以參考我國政府權威部門發布的“中國軟件歐美出口工程”試點企業名單。這些公司都具有一定的規模和實力,有些記者把這些公司比喻成“中國外包的國家隊”,言外之意其他的外包公司只能算是“地方武裝”了。

    大連的軟件外包發展的最為快速,特別是對日外包做的最為成功,因為大連的政府支持,地理位置靠日本很近,可以找到很多掌握日語的軟件技術人員。北京和上海的軟件外包發展的時間更長,這兩個直轄市憑借經濟和政治的影響,吸引了大量的國外客戶,人才資源很豐富,所以外包做的很早,很多歐美的大型軟件公司都在這兩個城市成立的研發中心。

    說到外包公司,很多人首先想到的是中國本土的外包公司,其實出了本土外包公司,國外外包公司在中國的分公司也不可忽視。這些國外外包公司有的進入中國較早,有的最近一兩年才在中國落戶。他們憑借國外市場的良好客戶關系,全球的專業品牌,先進的外包管理技術,豐富的外包經驗,加上國際化的工作環境,良好的薪資待遇,吸引著很多大學生前去應聘。

    最后給同學們一點建議,大家在找工作的時候與要單純追求規模大的外包公司,中小規模的外包公司有可能發展速度更快,有可能提供很大的職業發展空間。關鍵是通過各種方式綜合了解軟件外包公司的發展前景、工作環境和個人發展空間,可以通過打聽在外包公司工作的同學、朋友、親戚、老鄉,也可以上網看看外界對這家公司的報道和評論。


    [7] - 軟件外包公司需要什么樣的人?

    剛畢業的同學如果沒有考研或出國留學,都有過找工作應聘的經歷,不少同學都感覺找到合適的工作單位不是一件容易的事情。有些同學雖然得到了軟件外包公司的應聘機會,但是面試后就沒有消息了。

    而一些軟件外包公司的招聘人員卻為找不到合適的人員而苦惱,只好發動一切可以調動的因素,解決企業人才困乏的問題。所以有人把這種現象歸納為:“高校有人沒事干,企業有事沒人干”。

    這種現象的本質是大部分高校畢業生的綜合素質達不到軟件外包企業的用人要求。那么軟件外包公司需要什么樣的人呢?為了能夠進入軟件外包企業,在校學生應該如何學習和學習什么呢?

    說的簡單一點,企業需要的是能馬上融入外包項目團隊,獨立承擔實際外包項目任務的人。所以很多企業在招聘啟事中都有“x年軟件外包相關工作經驗”等的硬性指標,而這些都是在校學生欠缺的地方。

    現在一些外包公司都提供兼職崗位(Freelancer),這是在校學生(尤其是即將畢業的學生)參與社會實踐的好機會,應該抓住這些實習機會,積累工作經驗。另外,如果在這些企業實習期間表現優秀,畢業后有機會成為公司的正式員工。

    軟件外包企業對待大學畢業生更看重學生的學習能力。剛畢業的大學生就像一塊好的毛坯鋼材,材質優良,如果這些學生有較好的主動學習能力,進入企業后經過幾個外包項目的實踐,積極思考,善于總結,成長很快。企業不歡迎凡事不經過大腦思考,大小問題都要向主管求助的“懶漢”員工。

    企業需要具有職業精神的員工。職業精神包括很多方面的內容,包括對工作的熱情投入,積極與團隊成員交流,具有合作精神,以企業利益為重。而不歡迎喜歡與企業討價還價,抱怨企業提供的發展空間不夠大的學生。

    由于軟件外包服務行業是為客戶提供服務的行業,很多外包項目的具體任務一般比較瑣碎、枯燥,例如按照客戶提供的軟件框架進行編碼,按照客戶提供的測試用例執行軟件測試。對于剛剛畢業的學生他們都需要從這些很基礎的技術崗位做起,這是對他們職業精神和做事風格的考驗。

    軟件外包服務的很多工作就像生產流水線上的公司在擰螺絲釘,需要遵守嚴格的生產流程和一絲不茍的嚴謹精神。把這些基本工作做好了,才能取得企業的管理人員的信任,才有機會承擔更復雜更大責任的工作。

    一些剛畢業的學生經常心高氣傲,很鄙視這些繁瑣枯燥的工作,感嘆埋沒他們的才華,這是沒有擺正工作心態的表現。外包公司非常歡迎愿意做看似瑣碎的工作同時有能力做好的同學。其實做好這些看似瑣碎的工作,當好擰螺絲的工人,就是不簡單,他的未來就會不平凡。道理很簡單:基礎打好了,萬丈高樓平地起。

    總結起來,外包企業需要具有一定的外包工作經驗,主動學習能力強,團隊合作精神好,愿意從瑣碎的技術工作做起,而且有能力做好“小事”的人。

    海爾公司總裁張瑞敏有句名言說得非常好,對于準備到軟件外包公司工作的同學非常有啟發,他說:“把一件簡單的事做好就是不簡單,把每一件平凡的事做好就是不平凡”。


    ?[8] - 哪些人不適合做軟件外包技術人員?

    大千世界,無限精彩。作為軟件行業的新領域,軟件外包吸引著越來越多的人投入這個行業。每個行業都有行業的行規和準則,并不是任何人都適合從事軟件外包行業的。

    哪些人不適合從事軟件外包呢?由于本文的讀者針對即將畢業的大學生,也適用于準備加入軟件外包公司的新人,所以我們可以把問題縮小范圍:哪些人不適合做軟件外包服務的技術人員?

    回答什么人不能做軟件外包,也就是哪些人做不好軟件外包,需要先了解軟件外包服務行業的工作性質和對人的綜合要求。軟件外包是為客戶提供專業技術服務的行業,而且現在的軟件外包企業的客戶大都來自國外,客戶對外包公司人員要求比較嚴格。另外,外包公司的工作非常具體和瑣碎,需要一絲不茍。

    軟件外包行業的這些特點,決定了以下三種類型的人不適合做軟件外包的技術人員:

    第一種人是外語不過關的人。

    語言是交流工具。如果客戶是歐美客戶,英語交流是必不可少的。如果客戶是日本公司,對日語要必須熟悉。作為初級的外包技術人員,需要閱讀和寫作大量的文檔和郵件,這些都需要良好的英語能力。很多英語不過關的人員不容易通過外包公司的筆試。對英語的要求,需要達到熟練閱讀英文文檔,寫作專業的測試缺陷報告和日常郵件寫作的程度。

    外包公司強調英語的重要性,這是做好工作的基礎,因此,請在學校里、公司里利用一切條件自覺學習英語,養成習慣,從閱讀理解學習。把英語閱讀和寫作養成一個習慣,終生受益。

    第二種人是癡迷于鉆研軟件高深技術的人。

    軟件外包服務的很多工作都是非常瑣碎的,看上去沒有多少高深新技術的事務性工作。例如,對日軟件外包的項目,客戶已經編制好了程序框架,需要變成人員根據他們的規范編寫代碼和每天工作進度日志。不少外包編程人員抱怨客戶限定的過于嚴格,沒有足夠的自我創造的空間。對于軟件外包測試人員,最常見的工作就是執行客戶編寫好的測試用例,報告軟件缺陷,很少有機會從軟件項目的全局高度制定測試計劃,確定測試方案和策略,安排資源和進度。

    如果你對軟件編程的各種新技術無限熱愛,習慣于一個人無拘無束的從事軟件產品的開發,最好不要去軟件外包公司,否則很難發揮你的聰明才智。這樣的人更適合自己創業開發獨立的軟件產品,或者到中國中小型軟件公司當軟件開發工程師。

    第三種人是大事做不來,小事不愿做的人。

    正如前面說過的,很多軟件外包工作非常具體和瑣碎,需要非常好的做事態度,滿足客戶各種合理的和不合理的要求。有些同學到軟件外包公司工作不久就感到失望了,抱怨工作枯燥,看不到前途。這些都是剛參加不久的人容易產生的錯誤認識。

    在任何軟件外包公司,如果個人的工作能力非常突出,很容易被領導賞識和提升,因為軟件外包發展太快了,對人才的需求非常強烈。但是如果不從具體的瑣碎的小事做起,并且把小事做好,怎么能證明你可以把大事做好呢。

    任何公司之所以能夠生存、發展、壯大,必尤其成功之處,不要覺得你必老板高明很多。比較聰明的同學會放平心態,從學徒學起,把每一件工作都做好了,自己的長處得到發揮,對自己的前途發展大有幫助。

    總結起來,不善于外與交流的,癡迷于鉆研軟件高新技術,不能踏踏實實工作的人,不適合到軟件外包公司從事軟件技術工作。


    [9] - 如何通過軟件外包公司的面試?

    如何通過軟件外包公司的面試?這是很多同學都很關注的問題。面試成功來自于應聘者自身的綜合實力和運氣。為了提高面試成功率,請按照以下幾個方面進行準備。

    (1)制作有吸引力的求職簡歷

    外包公司的招聘專員每天都會收到幾十封甚至上百封求職簡歷,如果你的簡歷很平淡,可能很快從招聘專員的眼下溜走,失去了面試的機會。

    什么是有吸引力的簡歷? 簡單地說就是讓看到你簡歷的招聘專員相信你就是他們正在尋找的最合適的人。因此,你的簡歷要簡明扼要,列舉出符合他們要求的條件和相應的客觀證據。要明白求職簡歷目的就是獲得面試的機會,否則你的水平再高,也不可能進入招聘專員的“法眼”。

    如何寫出具有吸引力的簡歷,現在很多資料都比較詳細,但是最重要的一點是實事求是,反對夸張和吹噓。把你的技能和經驗按照招聘職位的要求進行內容和形式的組織即可。

    (2)準備面試

    • 了解要去面試的公司,可以瀏覽公司的網站,媒體報道,同學和朋友的介紹。
    • 了解公司的行業,規模,現狀和發展概況。
    • 技術準備,準備應聘職位要求的技能
    • 模擬面試場景(包括英語自我介紹和書面答題)
    • 準備自我介紹、各種證書、筆試和面試解答問題
    • 計劃乘車路線和穿著打扮等外表形象

    (3)參加面試

    • 準時
    • 誠實
    • 積極
    • 友好
    • 不必不亢
    • 注意細節
    • 沉著冷靜
    • 避免爭論
    • 小心“陷阱”
    • 充分發揚長處
    • 展示個人綜合能力
    posted @ 2006-10-03 00:26 方佳瑋 閱讀(1366) | 評論 (0)編輯 收藏

    初次寫js,感覺很不錯

    需求:
    1. session 傳值初始化時鐘,格式 hh:mm:ss
    2. 時鐘在頁面上顯示倒計時功能
    3. 時間到觸發點擊按鈕事件

    <body?MS_POSITIONING="GridLayout"?onLoad="window.setInterval('Clock()',?1000);">
    ????????
    <script?type="text/javascript">
    ????????
    ????????
    function?Clock(){??????????????????
    ????????????
    var?init?=?clock.innerText;
    ????????????
    var?stop?=?new?Number("0");

    ????????????
    var?hms?=?new?String(init).split(":");
      ????????
    var?s?=?new?Number(hms[2]);
      ????????
    var?m?=?new?Number(hms[1]);
      ????????
    var?h?=?new?Number(hms[0]);
      ????????
      ????????
      ????????
      ????????
    if(stop?==?0){
      ????????????
    if(s?==?0){
      ????????????????
    if(m?==?0){
      ????????????????????
    if(h?==?0){
      ????????????????????????stop?
    =?1;
      ????????????????????????
    var?e?=?document.getElementById("finish").click();
      ????????????????????}

      ????????????????????
    else{
      ????????????????????????h
    --;
      ????????????????????}

      ????????????????????m?
    =?59;
      ????????????????}

      ????????????????
    else{
      ????????????????????m
    --;
      ????????????????}

      ????????????????s?
    =?59;
      ????????????}

      ????????????
    else{
      ????????????????s
    --;
      ????????????}

      ????????}

      ????????
    var?ss?=?s?<?10???("0"?+?s)?:?s;
      ????????
    var?sm?=?m?<?10???("0"?+?m)?:?m;
      ????????
    var?sh?=?h?<?10???("0"?+?h)?:?h;
      ????????init?
    =?sh?+?":"?+?sm?+?":"?+?ss;
      ????????clock.innerText?
    =?init;?????????
    ????????}

    ????????
    </script>

    <form?id="Form1"?name="Form1"?method="post"?runat="server">
    <SPAN?id="clock"><STRONG>
    <%=(string)Session["time"]%></STRONG></SPAN>
    <asp:button?id="finish"?runat="server"?Width="70px"?Height="20px"?Text="完成提交"></asp:button>
    </form>
    posted @ 2006-10-01 00:35 方佳瑋 閱讀(1109) | 評論 (1)編輯 收藏

    我大二時是java初學者,很多用法不當,哈哈,現在看來確實有點幼稚。當時同時在學數據結構。把c改編成java。現在把自己的作業和大家分享。

    地址:http://www.java-cn.com/bbs-jsp/show.jsp?forum=base&id=142767
    posted @ 2006-09-15 11:34 方佳瑋 閱讀(702) | 評論 (0)編輯 收藏

    在公司工作了1個多月了,最近突然領悟了,領悟了何為計算機專業。
    ?
    迷戀Java不是錯,因為這是應屆畢業生輕松進入好公司的敲門磚,但是也可以說是錯!
    ?
    導師何立勇對我說:“是人使用工具,而不是工具使用人”,我現在完全領悟了,Java,vb,.net,任何開發語言,任何開發技術,所有計算機相關的技術知識都只是完成客戶需求工具而已。有人喜歡java,喜歡struts,hibernate,spring,鄙視老的技術,鄙視.net,鄙視vb都是不正確的,也是一個初級程序員的思想。
    ?
    我們作為計算機專業的,為了什么,其實為了有實力更好地使用工具滿足客戶需求。讀研,讀博也就是這個目的,英語流利精通也是這個目的。我以前放棄英語和計算機基礎知識從長遠看是錯誤。所以既然我已經有實力求職,我以后也沒必要揀了芝麻丟了西瓜,在公司好好做個java程序員,同時學好英語學好計算機其他重要知識和工作相關的知識,有必要的話會考碩士,更好的成為優秀的工具使用者,以后才不會永遠只是個java程序員。
    ?
    但是,獨立解決問題的能力,動手能力,開發經驗,我在大學里已經做得非常不錯了,確實成為我進入NCS的結識的敲門磚。(NCS是新加坡外企,新加坡人會說中文,否則我也進不去,因為美國外企英語口語面試,只能說我運氣好而已)
    所以告誡所有同學,包括考研的同學,理論知識,英語非常重要,但如果沒有獨立解決問題的能力,動手能力,開發經驗,你也很難成功!
    就像我認識的一個南京大學研究生,在讀時排名前5,畢業后由于沒有以上敲門磚最后找不到好工作,于是參加8個月的J2ee培訓,多累啊,現在惠普工作月薪8000,以后會更高,這個是活生生的例子。但也只有名牌大學碩士同時有敲門磚才能拿那么高的,英語不好我是肯定進不了惠普的。
    ?
    繞了個大圈回到起點,我要開始揀西瓜了。。。。。。


    作為計算機專業的,實戰經驗,理論,英語,3者都要好,而不是選擇其一鉆牛角尖,
    實戰經驗好的雖然找工作不難,但好的公司,高的職位是妄想。3者都平庸的話那就更沒出路了,如今太多人3者平庸了。在今后的時間里,我要平衡3者,都要提高,我想我領悟地還不算晚!以前小錯中有對的地方,但不能讓其成為大錯。

    這點確實2班的個別同學,比如領導做得非常好,我班目前沒有。這就是為何IT行業,有人拿數萬月薪,有人拿8000月薪,有人拿2000,3000月薪,有人雖然計算機專業卻壓根進不了IT行業。

    不同選擇重視不一樣,想本科畢業就業的,想在1,2年內拿4000~6000月薪的(上海),請重視實戰經驗,并且逐步提高理論和英語,以后跳槽到好公司也有資本。想考研的,重視后兩者,在讀研時千萬重視實戰經驗。這個經驗相當于受過至少半年以上培訓的水平。畢竟時間有限,本科也就這么4年,3項全能都是高手,實在是難!

    (自我介紹,上海華理計算機專業,今年9月大四,一直追求j2ee,扔掉專業扔掉英語,如今領悟)

    posted @ 2006-09-02 23:52 方佳瑋 閱讀(938) | 評論 (4)編輯 收藏

    1.Method_Add
    /*
    輸出:
    It?is?now?星期四?2006/08/17?at?05:55:57?下午?CST
    Two?years?ago?was?星期二?2004/08/17?at?05:55:57?下午?CST
    */

    package ?api.java.util.Calendar;

    import ?java.text.SimpleDateFormat;
    import ?java.util.Calendar;

    public ? class ?Method_Add? {
    ????
    public ? static ? void ?main(String[]?a)? throws ?Exception? {

    ????????Calendar?now?
    = ?Calendar.getInstance();
    ????????
    ????????SimpleDateFormat?formatter?
    = ? new ?SimpleDateFormat(
    ????????????????
    " E?yyyy/MM/dd?'at'?hh:mm:ss?a?zzz " );
    ????????System.out.println(
    " It?is?now? " ? + ?formatter.format(now.getTime()));
    ????????
    /*
    ?????????*?public?abstract?void?add(int?field,?int
    ?????????*?amount)根據日歷的規則,為給定的日歷字段添加或減去指定的時間量。
    ?????????
    */

    ????????now.add(Calendar.YEAR,?
    - 2 );
    ????????System.out.println(
    " Two?years?ago?was? "
    ????????????????
    + ?formatter.format(now.getTime()));
    ????}

    }


    主要經驗值獲得:
    1. java.text.SimpleDateFormat 的用法
    2. java.util.Calendar.add( ) 的用法,如何進行日期計算。

    ----------------------------------------------------------------------------------

    2.Class_GregorianCalendar
    /*
    輸出:
    136?days?remain?in?current?year
    */

    package?api.java.util.Calendar;

    import?java.util.Calendar;
    import?java.util.GregorianCalendar;

    public?class?Class_GregorianCalendar?{
    ????
    public?static?void?main(String?args[])?{

    ????????Calendar?calendar1?
    =?Calendar.getInstance();
    ????????
    int?doy1?=?calendar1.get(Calendar.DAY_OF_YEAR);

    ????????
    int?year?=?calendar1.get(Calendar.YEAR);
    ????????
    ????????
    //在具有默認語言環境的默認時區內構造一個帶有給定日期設置的?GregorianCalendar
    ????????Calendar?calendar2?=?new?GregorianCalendar(year,?11,?31);
    ????????
    int?doy2?=?calendar2.get(Calendar.DAY_OF_YEAR);
    ????????
    ????????
    //今年最后一天減去今天的剩余天數
    ????????int?days?=?doy2?-?doy1;
    ????????System.out.println(days?
    +?"?days?remain?in?current?year");
    ????}

    }


    主要經驗值獲得:
    1. java.util.GregorianCalendar 的作用
    2. 如何返回指定的日期的Calendar

    次要經驗值獲得
    1. 如何計算據今年結束的天數

    ----------------------------------------------------------------------------------

    3.Class_Calendar
    /*
    輸出:
    ERA:?1
    YEAR:?2006
    MONTH:?7
    WEEK_OF_YEAR:?33
    WEEK_OF_MONTH:?3
    DATE:?17
    DAY_OF_MONTH:?17
    DAY_OF_WEEK:?5
    DAY_OF_WEEK_IN_MONTH:?3
    AM_PM:?1
    MILLISECOND:?92
    ZONE_OFFSET:?8
    DST_OFFSET:?0

    */

    package?api.java.util.Calendar;

    import?java.util.Calendar;
    import?java.util.Date;
    import?java.util.GregorianCalendar;

    public?class?Class_Calendar?{
    ????
    public?static?void?main(String[]?a)?{
    ????????Calendar?calendar?
    =?new?GregorianCalendar();
    ????????calendar.setTime(
    new?Date());

    ????????System.out.println(
    "ERA:?"?+?calendar.get(Calendar.ERA));
    ????????System.out.println(
    "YEAR:?"?+?calendar.get(Calendar.YEAR));
    ????????System.out.println(
    "MONTH:?"?+?calendar.get(Calendar.MONTH));
    ????????System.out.println(
    "WEEK_OF_YEAR:?"
    ????????????????
    +?calendar.get(Calendar.WEEK_OF_YEAR));
    ????????System.out.println(
    "WEEK_OF_MONTH:?"
    ????????????????
    +?calendar.get(Calendar.WEEK_OF_MONTH));
    ????????System.out.println(
    "DATE:?"?+?calendar.get(Calendar.DATE));
    ????????System.out.println(
    "DAY_OF_MONTH:?"
    ????????????????
    +?calendar.get(Calendar.DAY_OF_MONTH));
    ????????System.out
    ????????????????.println(
    "DAY_OF_WEEK:?"?+?calendar.get(Calendar.DAY_OF_WEEK));
    ????????System.out.println(
    "DAY_OF_WEEK_IN_MONTH:?"
    ????????????????
    +?calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
    ????????System.out.println(
    "AM_PM:?"?+?calendar.get(Calendar.AM_PM));
    ????????System.out
    ????????????????.println(
    "MILLISECOND:?"?+?calendar.get(Calendar.MILLISECOND));
    ????????System.out.println(
    "ZONE_OFFSET:?"
    ????????????????
    +?(calendar.get(Calendar.ZONE_OFFSET)?/?(60?*?60?*?1000)));
    ????????System.out.println(
    "DST_OFFSET:?"
    ????????????????
    +?(calendar.get(Calendar.DST_OFFSET)?/?(60?*?60?*?1000)));
    ????}

    }


    主要經驗值獲得:
    1.?Calendar 的一些變量和方法用法

    ----------------------------------------------------------------------------------

    4.
    posted @ 2006-08-17 18:00 方佳瑋 閱讀(1861) | 評論 (1)編輯 收藏

         摘要: 1. Constructor /**/ /* 介紹:Constructor?提供關于類的單個構造方法的信息以及對它的訪問權限。輸出:java.util.ArrayList:?Collection?java.util.ArrayList:?int?java.util.Ar...  閱讀全文
    posted @ 2006-08-15 14:09 方佳瑋 閱讀(2984) | 評論 (1)編輯 收藏

         摘要: GWT QQ 群號:28310588用過gwt的都知道,對一個按鈕button做點擊事件很簡單,但要做鼠標事件,比如over,up,leave就沒辦法了,但extends Button就能做到,以下就是這個例子:我自己寫的package?mypack.client;import?com.google.gwt.core.client.EntryPoint;import?com.google.gwt....  閱讀全文
    posted @ 2006-08-02 10:15 方佳瑋 閱讀(1701) | 評論 (2)編輯 收藏

    主站蜘蛛池模板: 久久er国产精品免费观看8| 国产成人无码精品久久久免费| 日韩免费电影网站| 亚洲人精品午夜射精日韩| 国产自国产自愉自愉免费24区 | 国产精品成人69XXX免费视频| 亚洲精品无码永久在线观看| 一区二区三区免费视频观看 | 99免费观看视频| 亚洲日韩在线视频| 无码国产精品久久一区免费| 亚洲日韩国产欧美一区二区三区| 暖暖免费高清日本中文| 色噜噜狠狠色综合免费视频| 久久精品国产亚洲AV不卡| 精品国产污污免费网站| 亚洲精品视频久久| 夫妻免费无码V看片| 欧洲美女大片免费播放器视频| 亚洲国产婷婷香蕉久久久久久| 中文字幕一区二区免费| 亚洲成av人片不卡无码| 日韩成人免费aa在线看| 久久久久久av无码免费看大片| 亚洲综合精品香蕉久久网97| 成人免费AA片在线观看| 日韩亚洲人成网站| 国产亚洲综合成人91精品| 久久久久久久免费视频| 五月婷婷免费视频| 亚洲国产韩国一区二区| 亚洲国产精品专区在线观看 | 特级无码毛片免费视频尤物| 亚洲人成综合在线播放| 亚洲精品人成无码中文毛片 | 亚洲∧v久久久无码精品| 在线a级毛片免费视频| 国产高清对白在线观看免费91| 亚洲人成电影福利在线播放| 色吊丝最新永久免费观看网站| 国产精品免费在线播放|