Sunday, May 10, 2009

韩信点兵

秦朝末年,楚汉相争。一次,韩信将1500名将士与楚王大将李锋交战。苦战一场,楚军不敌,败退回营,汉军也死伤四五百人,于是韩信整顿兵马也返回大本营。当行至一山坡,忽有后军来报,说有楚军骑兵追来。只见远方尘土飞扬,杀声震天。汉军本来已十分疲惫,这时队伍大哗。韩信兵马到坡顶,见来敌不足五百骑,便急速点兵迎敌。他命令士兵3人一排,结果多出2名;接着命令士兵5人一排,结果多出3名;他又命令士兵7人一排,结果又多出2名。韩信马上向将士们宣布:我军有1073名勇士,敌人不足五百,我们居高临下,以众击寡,一定能打败敌人。汉军本来就信服自己的统帅,这一来更相信韩信是“神仙下凡”、“神机妙算”。于是士气大振。一时间旌旗摇动,鼓声喧天,汉军步步进逼,楚军乱作一团。交战不久,楚军大败而逃。
韩信是怎么计算出来的,你能用程序验证出来吗?


public class Main{
public static void main(String[] args){
for(int i=1000;i<1100;i++){
if(isPassed(i,3,2) && isPassed(i,5,3) && isPassed(i,7,2)){
System.out.println(i);
}
}
}

public static boolean isPassed(int count,int m,int n){
return count % m==n;
}
}

求一百以内的质数和

质数的定义: 一个大于1的自然数,除了1与它自身外,再没有其它的正约数了,这样的自然数叫做质数。
现要求编写一个程序,将一百以内的质数总和求出。


int sum=0;

for(int i=2;i<100;i++){
if(isZhiShu(i)){
sum=sum+i;
}
}
System.out.println(sum);



public static boolean isZhiShu(int num){
for(int i=2;i< num/2+1;i++){
if(num%i==0)
return false;
}

return true;

}

找出10000以内的所有回文数

即12321是回文数,个位与万位相同,十位与千位相同。
131是回文数
141是回文数
2992是回文数
3003是回文数
3113是回文数
3223是回文数
3333是回文数



int flag=0;
String s;
for(int n=0;n<10000;n++){
s="";
s=s+n;
flag=0;
for(int m=0;m< s.length();m++){
if(s.charAt(m)!=s.charAt(s.length()-m-1)){
flag=1;
}
}
if(flag==0){
System.out.println(s+" 是回文数");
}
}

鸡兔同笼问题

这个问题,是我国古代著名趣题之一。大约在1500年前,《孙子算经》中就记载了这个有趣的问题。书中是这样叙述的:“今有鸡兔同笼,上有三十五头,下有九十四足,问鸡兔各几何?这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。求笼中各有几只鸡和兔?
请用程序计算出来鸡和兔各多少只?



for(int j=0;j<=35;j++)
for(int i=0;i<=94/4;i++)
if(j*2+i*4==94 && i+j==35)
System.out.println("兔子:"+i+" "+"鸡:"+j);

ABCDE=4*EDCBA

ABCDE=4*EDCBA;其中,A、B、C、D、E都是1-9中的数字。问这5个数字都是多少。


int a,b,c,d,e;
for(int i=10000;i<100000;i++){
a=i/10000;
b=(i-a*10000)/1000;
c=(i-a*10000-b*1000)/100;
d=(i-a*10000-b*1000-100*c)/10;
e=i%10;

int sum=40000*e+4000*d+400*c+40*b+4*a;

if(sum==i){
System.out.println(i);
}
}

结果:87912

Saturday, May 9, 2009

马克思手稿中的数学题

马克思手稿中有一道趣味数学问题:有30个人,其中有男人、女人和小孩,在一家饭馆吃饭花了50先令;每个男人花3先令,每个女人花2先令,每个小孩花1先令;问男人、女人和小孩各有几人?








设x,y,z分别代表男人、女人和小孩。按题目的要求,可得到下面的方程:
x+y+z=30 (1)
3x+2y+z=50 (2)
用方程程序求此不定方程的非负整数解,可先通过(2)-(1)式得:
2x+y=20 (3)
由(3)式可知,x变化范围是0~10

public class Main{
public static void main(String[] args){
int x,y,z;

for(x=0;x<=10;x++){
y=20-2*x;
z=30-x-y;

if(3*x+2*y+z==50){
System.out.println("男人数目为:"+x+"女人数目为:"+y+"小孩数目为:"+z);
}
}
}
}

Friday, May 1, 2009

类加载器

J2EE关于类加载的规范已经 成为了J2EE的标准之一。 类加载是java语言提供的最强大的机制之一,但所有的编程人员都应该了解其工作机制,明白如何做才能让其满足我们的需要。 这能有效节省我们的编码时间,从不断调试ClassNotFoundException的工作中解脱出来。

   类与数据  

  一个类代表要执行的代码,而数据则表示其相关状态。状态时常改变,而代码则不 会。当我们将一个特定的状态与一个类相对应起来,也就意味着将一个类事例化。尽管相同的类对应的实例其状态千差万别,但其本质都对应着同一段代码。在 JAVA中,一个类通常有着一个.class文件,但也有例外。在JAVA的运行时环境中(Java runtime),每一个类都有一个以第一类(first-class)的Java对象所表现出现的代码,其是java.lang.Class的实例。我 们编译一个JAVA文件,编译器都会嵌入一个public, static, final修饰的类型为java.lang.Class,名称为class的域变量在其字节码文件中。因为使用了public修饰,我们可以采用如下的形 式对其访问:

java.lang.Class klass = Myclass.class;
    

  一旦一个类被载入JVM中,同一个类就不会被再次载入了(切记,同一个类)。这里存在一个问题就是什么是“同一个类”?正如一个对象有一个具体的状态,即标识,一个对象始终和其代码(类)相关联。同理,载入JVM的类也有一个具体的标识,我们接下来看。  

  在JAVA中,一个类用其完全匹配类名(fully qualified class name)作为标识,这里指的完全匹配类名包括包名和类名。但在JVM中一个类用其全名和一个加载类ClassLoader的实例作为唯一标识。因此,如 果一个名为Pg的包中,有一个名为Cl的类,被类加载器KlassLoader的一个实例kl1加载,Cl的实例,即C1.class在JVM中表示为 (Cl, Pg, kl1)。这意味着两个类加载器的实例(Cl, Pg, kl1) 和 (Cl, Pg, kl2)是不同的,被它们所加载的类也因此完全不同,互不兼容的。那么在JVM中到底有多少种类加载器的实例?下一节我们揭示答案。  

  类加载器  

  在JVM中,每一个类都被java.lang.ClassLoader的一些实例来加载.类ClassLoader是在包中java.lang里,开发者可以自由地继承它并添加自己的功能来加载类。  

  无论何时我们键入java MyMainClass来开始运行一个新的JVM,“引导类加载器(bootstrap class loader)”负责将一些关键的Java类,如java.lang.Object和其他一些运行时代码先加载进内存中。运行时的类在JRE\lib \rt.jar包文件中。因为这属于系统底层执行动作,我们无法在JAVA文档中找到引导类加载器的工作细节。基于同样的原因,引导类加载器的行为在各 JVM之间也是大相径庭。  

  同理,如果我们按照如下方式:

log(java.lang.String.class.getClassLoader()); 

   

  来获取java的核心运行时类的加载器,就会得到null。  

  接下来介绍java的扩展类加载器。扩展库提供比java运行代码更多的特性,我们可以把扩展库保存在由java.ext.dirs属性提供的路径中。  

  (注:java.ext.dirs属性指的是系统属性下的一个key,所有的系 统属性可以通过System.getProperties()方法获得。在编者的系统中,java.ext.dirs的value是” C:\Program Files\Java\jdk1.5.0_04\jre\lib\ext”。下面将要谈到的如java.class.path也同属系统属性的一个 key。)

类ExtClassLoader专门用来加载所有java.ext.dirs下的.jar文件。开发者可以通过把自己的.jar文件或库文件加入到扩展目录的classpath,使其可以被扩展类加载器读取。  

  从开发者的角度,第三种同样也是最重要的一种类加载器是AppClassLoader。这种类加载器用来读取所有的对应在java.class.path系统属性的路径下的类。  

  Sun的java指南中,文章“理解扩展类加载”(Understanding Extension Class Loading)对以上三个类加载器路径有更详尽的解释,这是其他几个JDK中的类加载器

  ●java.net.URLClassLoader
  ●java.security.SecureClassLoader
  ●java.rmi.server.RMIClassLoader
  ●sun.applet.AppletClassLoader 

 

  java.lang.Thread,包含了public ClassLoader getContextClassLoader()方法,这一方法返回针对一具体线程的上下文环境类加载器。此类加载器由线程的创建者提供,以供此线程中运 行的代码在需要加载类或资源时使用。如果此加载器未被建立,缺省是其父线程的上下文类加载器。原始的类加载器一般由读取应用程序的类加载器建立。


类加载器如何工作?  

  除了引导类加载器,所有的类加载器都有一个父类加载器,不仅如此,所有的类加载 器也都是java.lang.ClassLoader类型。以上两种类加载器是不同的,而且对于开发者自订制的类加载器的正常运行也至关重要。最重要的方 面是正确设置父类加载器。任何类加载器,其父类加载器是加载该类加载器的类加载器实例。(类加载器本身也是一个类) 

  使用loadClass()方法可以从类加载器中获得该类。我们可以通过java.lang.ClassLoader的源代码来了解该方法工作的细节,如下:

protected synchronized Class loadClass
  (String name, boolean resolve)
  throws ClassNotFoundException{
  // First check if the class is already loaded
  Class c = findLoadedClass(name);
  if (c == null) {
  try {
  if (parent != null) {
  c = parent.loadClass(name, false);
  } else {
  c = findBootstrapClass0(name);
  }
  } catch (ClassNotFoundException e) {
  // If still not found, then invoke
  // findClass to find the class.
  c = findClass(name);
  }
  }
  if (resolve) {
  resolveClass(c);
  }
  return c;}
  
  我们可以使用ClassLoader的两种构造方法来设置父类加载器:
  
  public class MyClassLoader extends ClassLoader{
  public MyClassLoader(){
  super(MyClassLoader.class.getClassLoader());
  }}
  
  或
  
  public class MyClassLoader extends ClassLoader{
  public MyClassLoader(){
  super(getClass().getClassLoader());
  }}
  
 

  

  第一种方式较为常用,因为通常不建议在构造方法里调用getClass()方 法,因为对象的初始化只是在构造方法的出口处才完全完成。因此,如果父类加载器被正确建立,当要示从一个类加载器的实例获得一个类时,如果它不能找到这个 类,它应该首先去访问其父类。如果父类不能找到它(即其父类也不能找不这个类,等等),而且如果findBootstrapClass0()方法也失败 了,则调用findClass()方法。findClass()方法的缺省实现会抛出ClassNotFoundException,当它们继承 java.lang.ClassLoader来订制类加载器时开发者需要实现这个方法。findClass()的缺省实现方式如下:

protected Class findClass(String name)
  throws ClassNotFoundException {
  throw new ClassNotFoundException(name);
  }
  
 

  

  在findClass()方法内部,类加载器需要获取任意来源的字节码。来源可 以是文件系统,URL,数据库,可以产生字节码的另一个应用程序,及其他类似的可以产生java规范的字节码的来源。你甚至可以使用BCEL (Byte Code Engineering Library:字节码工程库),它提供了运行时创建类的捷径。BCEL已经被成功地使用在以下方面:编译器,优化器,混淆器,代码产生器及其他分析工 具。一旦字节码被检索,此方法就会调用defineClass()方法,此行为对不同的类加载实例是有差异的。因此,如果两个类加载实例从同一个来源定义 一个类,所定义的结果是不同的。  

  JAVA语言规范(Java language specification)详细解释了JAVA执行引擎中的类或接口的加载(loading),链接(linking)或初始化(initialization)过程。  

  图一显示了一个主类称为MyMainClass的应用程序。依照之前的阐 述,MyMainClass.class会被AppClassLoader加载。 MyMainClass创建了两个类加载器的实例:CustomClassLoader1 和 CustomClassLoader2,他们可以从某数据源(比如网络)获取名为Target的字节码。这表示类Target的类定义不在应用程序类路径 或扩展类路径。在这种情况下,如果MyMainClass想要用自定义的类加载器加载Target类,CustomClassLoader1和 CustomClassLoader2会分别独立地加载并定义Target.class类。这在java中有重要的意义。如果Target类有一些静态的 初始化代码,并且假设我们只希望这些代码在JVM中只执行一次,而这些代码在我们目前的步骤中会执行两次——分别被不同的 CustomClassLoaders加载并执行。如果类Target被两个CustomClassLoaders加载并创建两个实例Target1和 Target2,如图一显示,它们不是类型兼容的。换句话说,在JVM中无法执行以下代码:

  

  Target target3 = (Target) target2;  

  以上代码会抛出一个ClassCastException。这是因为JVM把他 们视为分别不同的类,因为他们被不同的类加载器所定义。这种情况当我们不是使用两个不同的类加载器CustomClassLoader1 和 CustomClassLoader2,而是使用同一个类加载器CustomClassLoader的不同实例时,也会出现同样的错误。这些会在本文后边 用具体代码说明。

  


  图1. 在同一个JVM中多个类加载器加载同一个目标类  

  关于类加载、定义和链接的更多解释,请参考Andreas Schaefer的"Inside Class Loaders."

为什么我们需要我们自己的类加载器

  

  原因之一为开发者写自己的类加载器来控制JVM中的类加载行为,java中的类 靠其包名和类名来标识,对于实现了java.io.Serializable接口的类,serialVersionUID扮演了一个标识类版本的重要角 色。这个唯一标识是一个类名、接口名、成员方法及属性等组成的一个64位的哈希字段,而且也没有其他快捷的方式来标识一个类的版本。严格说来,如果以上的 都匹配,那么则属于同一个类。

  

  但是让我们思考如下情况:我们需要开发一个通用的执行引擎。可以执行实现某一特 定接口的任何任务。当任务被提交到这个引擎,首先需要加载这个任务的代码。假设不同的客户对此引擎提交了不同的任务,凑巧,这些所有的任务都有一个相同的 类名和包名。现在面临的问题就是这个引擎是否可以针对不同的用户所提交的信息而做出不同的反应。这一情况在下文的参考一节有可供下载的代码样 例,samepath 和 differentversions,这两个目录分别演示了这一概念。

  

  图2 显示了文件目录结构,有三个子目录samepath, differentversions, 和 differentversionspush,里边是例子:

  


  图2. 文件夹结构组织示例  

  在samepath 中,类version.Version保存在v1和v2两个子目录里,两个类具有同样的类名和包名,唯一不同的是下边这行:

public void fx(){
  log("this = " + this + ";
  Version.fx(1).");
  }

  

  V1中,日志记录中有Version.fx(1),而在v2中则是Version.fx(2)。把这个两个存在细微不同的类放在一个classpath下,然后运行Test类: 

set CLASSPATH=.;%CURRENT_ROOT%\v1;%CURRENT_ROOT%\v2
  %JAVA_HOME%\bin\java Test

  

类的加载与查看

即使有一个类并对它一无所知,但其实它本身就包括了许多信息,Java在需要使用到某个类时才会将类加载,并在JVM中以一个java.lang.Class的实例存在。从Class实例开始,可以获得类的许多信息。

1. Java在真正需要使用一个类时才会加以加载,而不是在程序启动时就加载。所谓真正需要通常指的是要使用指定的类生成对象时(或是用户指定要加载类时:Class.forName()、loadClass());声明并不导致类加载。

2.默认在类第一次被加载时会运行静态区域块

3. Class.forName(String name)(静态方法)实现动态加载类

4.static Class forName(String name,boolean initialize,ClassLoader loader)将initialize设置为false时,在加载类时并不会立即运行静态区块,而会在应用类建立对象时才运行静态区块。

5. Class对象表示所加载的类,取得Class对象之后,就可以取得与类相关联的信息

eg:
package 反射;

import java.lang.reflect.*;
public class SimpleClassViewer {

/**
* @param args
*/
public static void main(String[] arg) {
// TODO Auto-generated method stub
String args[]=new String [1];
args[0]="输入输出.CharArrayReaderWriterDemo";
try{
Class c=Class.forName(args[0]);
//取得包代表对象
Package p=c.getPackage();
System.out.printf("package %s;%n",p.getName());
//取得类型修饰,像class、interface
int m=c.getModifiers();
System.out.print(Modifier.toString(m)+" ");
//if is interface
if(Modifier.isInterface(m)){
System.out.print("interface ");
}
else{
System.out.print("class ");
}

System.out.println(c.getName()+" {");

Field[] fields=c.getDeclaredFields();
for(Field field:fields){
//显示权限修饰
System.out.print("\t"+Modifier.toString(field.getModifiers()));
//显示类型名称
System.out.print(" "+field.getType().getName()+" ");
//显示域成员名称
System.out.println(field.getName()+" ");
}

//取得声明的构造函数代表对象
Constructor[] constructors=c.getDeclaredConstructors();
//显示修饰权限
for(Constructor constructor:constructors){
System.out.print("\t"+Modifier.toString(constructor.getModifiers()));
//显示构造函数名称
System.out.println(" "+constructor.getName()+"();");
}

//取得声明的方法成员代表对象
Method[] methods=c.getDeclaredMethods();
for(Method method:methods){
//显示权限修饰
System.out.print("\t"+Modifier.toString(method.getModifiers()));
//显示放回类型名称
System.out.print(" "+method.getReturnType().getName()+" ");
//显示方法名称
System.out.println(method.getName()+"();");
}


System.out.println("}");
}

catch(ArrayIndexOutOfBoundsException e){
System.out.println("没有指定类");
}
catch(ClassNotFoundException e){
System.out.println("找不到指定类");
}

}


}

《潜伏》在办公室

《潜伏》并不是间谍片,而是一部不可多得的职场教程。余则成的经历,有绝对的现实意义,他用亲身体验,教导我们如何在险恶的职场生存。
而现今的职场,比余则成面临的环境更糟糕,我们都是在狂涛骇浪里潜伏的小人物。

所以,研究专家“余则成”是怎么说,怎么做的吧。



1、办公室里只有两种人,主角和龙套。
在《潜伏》里,每个角色都有个性。只龙套非但没性格而且还专业送死。

职场上也一样,想要过的轻松,不想往上爬,那就只能做一辈子的龙套。
作龙套的坏处就是:送死你先去,功劳全没有,裁员先考虑。
现在的职场绝不是养懒人的地方,你要比别人生存的好,就唯有当主角,让别人去做龙套。
你不能踩着别人肩膀,就只能做他人垫背。



2、每个人都要有大志,就算要毁灭世界也可以。
胸怀大志是做主角的首要条件。
譬如余则成的信仰,站长的贪钱,马奎和陆桥山要当副站长,李涯为了党国事业,这些都是大志,而有理想存在才能为此奋斗。

在职场上,你若没有一个奋斗目标,就不可能进取的往上爬,到最后只能沦为龙套,成为别人的牺牲品。
所以不管毁灭世界,还是成为第一首富,你都必须心存志向,以此为目标。



3、别被理想忽悠,理想是需要的,但不是别人的理想,而是你自己的。
当提起大志时,有人会想到企业目标,想到企业文化,想到老板慷慨激昂的演说。
忘了那些吧,老板的理想只是老板的,而职场上,你是独立的。要保持清醒头脑,不能被轻易忽悠。

《潜伏》里,不管站长还是戴笠,甚至是余则成自己都会提到党国的事业。而实际上,他们心里都清楚的很,一切都该以自己为先,自己的大志才是可奋斗的目标。
不管别人有什么理想,要牢牢记住自己的大志,这才是立命之根本。



4、如果真的没大志,那就为钱奋斗。
《潜伏》里,站长说过一句话。每个人都有解甲归田的时候,如果不是为了钱,谁要当这个官呢。
所以赚钱是人最主要的追求。职场上很危险的局面,就是老板用理想笼络人,想让人不拿钱白干活。
但真的肯不要钱干活,那你就是没价值的,既然没价值,还有什么存在的必要呢?
金钱是唯一衡量你价值的东西。你真的一无所求的话,那就为赚钱而奋斗。



5、你可以不聪明,但不可以不小心。
《潜伏》里似乎每个人都聪明,其实翠平也很聪明,可为什么她就状况不断,最后还暴露身份。
就因为她不够小心。

职场与此一样,你可以不聪明,但不可以不小心。
不聪明的人,最多笨拙一些,事情做的差一些。而在职场上,这不是很大的罪过。

但不小心就随时会触犯到别人的利益,犯下得罪人这个职场大忌。
到那时,穿小鞋都不晓得是为什么穿的。
管牢嘴,能风花雪月的时候就少议论同事,能说人好话时就别说坏话。
这就是余则成的生存之道。



6、你说的每句话,老板都会知道。所以要好好想想该说什么,不该说什么。
别奢望你私下说的话老板就听不到。老板能知道一切,这是真理。
就像余则成给左蓝写信,自以为夹在书里没人知道,而实际上,他落下的每个文字,每句话都有人注意。

在职场上完全相同,只要你不是一个人自言自语,就得担心谈话对象会把话传出去。
而经验告诉我们,每一句对公司的议论,最后都会传到老板耳朵里。
所以你跟任何人说话时,都要好好想想,该说什么,不该说什么。
不该说的绝对不能说,可说可不说的也闭嘴。



7、偶尔对老板交心是必要的,但要有的放矢。
余则成和站长关系亦师亦友,可谓是站长的铁杆亲信,两人之间时不时有促膝长谈。

记住,促膝长谈是种手段,而不是真的让你什么都说。偶尔的交心,说些无关紧要的私己话,能让老板觉着你贴心。
而事实上,从没一个上司会对你真的交心。
切忌一热泪盈眶,就把心窝子都交出去。
被出卖的,永远是交心的那个。



8、不管什么时候,装傻总是最不易犯错。
在《潜伏》里,余则成看起来傻傻的。当别人问起一些紧要问题时,都会装傻,罔顾左右而言它。
这实在是很高明的生存术。

金庸也曾经说过,他年迈耳背后,该听见的话就能听见,不该听见的话就听不见。
当有人要你当面表态站队,要你选择事情的方向,不管你怎么选都是错的。
那么装傻就是最好的选择,这是没选择时最不易犯错的方法。

别担心装傻的样子很拙劣,即使每个人都看出你在装傻,可他们依旧拿你没办法。
真正倒霉的是那些明确表态的人,有这些龙套牺牲,怎么也轮不到你。



9、把自己当成最聪明的人,往往是最笨的。
在刚开始时,余则成向左蓝隐瞒自己是军统特务,向吕宗芳隐瞒左蓝是激进分子。余则成觉得自己能掌控大局,可实际上,他才是对方棋盘上的棋子。
左蓝和吕宗芳早就决定把他发展成共产党了。

在职场上,总把自己当最聪明的人,一定是做龙套的命。
真正聪明的高手,是大智若愚,该精明时精明,不该精明时装傻。



10、一定要有靠山,但比靠山还可靠的,是让自己有价值。
余则成向来是有靠山的人,一开始的吕宗芳,后来的站长,甚至是戴笠。正是这些靠山的存在,才让余则成多次转危为安,不引人怀疑。
但比靠山更重要的,是余则成本身的价值。
如果没有军统背景,吕宗芳绝不会拉拢他。如果没有立下大功,戴笠也不会青眼相加。如果他不能帮站长弄钱,也不可能获得庇护。

所以在职场中,和上司们搞好关系是一门必须的功课,为自己找好靠山很重要。
而比此更重要的,是让自己有足够的价值,以致于每个上司都必须拉拢你。



11、你是上司的人,上司却不一定是你的人,这层意思一定要明白。
当一个上司对你说,你是他的人时,心里一定要清楚,上司并不是你的人。
你是他的,他是他自己的。

在潜伏里,马奎曾经是毛人凤的侍卫,按说有此大靠山该有恃无恐才对。但马奎一出事情,毛人凤立刻就躲了。
当你的事情与上司的利益有冲突时,他们会毫不犹豫的出卖你。

无论何时都要记住,你是你自己的,只有你才能对自己负责。
别相信上司故作亲近的话,那随时都会是陷阱。



12、上司说他对你很放心,事实可能正好相反。
站长经常对余则成说,我对你很放心。可事实上,站长对余则成的试探调查从没停过。
如果上司真的对你放心,他根本不用经常提及。

真正的信任,是通过行动表现的。当上司愿意把害人的事情,把职场斗争的事情和你一起做,那才是信任的表现。
而上司口头说对你放心,则反而要当心了,很可能你做了什么,让上司产生你不忠的怀疑。



13、站在上司立场上想问题,站在自己立场上办事情。
当上司相信你,让你做一些事情时,心里必须要有本帐,别傻兮兮的什么都做。
你要站在上司立场上去考虑问题,了解上司为什么要做,能达到什么目的。然后再以自己的立场抉择,有些做,有些推脱。

就算是象余则成这样看似对站长忠心耿耿的人,也不是什么都会做的。
选择符合自己利益的事情去做,不符合利益的想法推搪。
用做了的事情取悦上司,而不做的事情则让上司知道,你已经完全尽力了。



14、上司突然垮台,不要惊慌,独自完成任务,然后借此再找到新的靠山。
《潜伏》里,余则成和吕宗芳被派去南京刺杀叛徒。而吕宗芳突然牺牲,余则成并没有慌张,反而独立完成任务,成为军统大功臣,完成了事业转折。

在职场里,经常发生上司突然垮台的事情。
如果你不幸遇见,千万别惊慌,独自完成手上的工作,而且要做的漂亮精彩。
而这就是你将来安身立命的资本,你可以借此找到新的靠山。

还是那句话,必须要让自己有价值,这比有人罩着你还重要。



15、做事做的好,干活干到老。
余则成并非总是聪明的,他与党组织相比就是弱者。余则成不懂得“做事做的好,干活干到老”这个道理,所以他从一开始做潜伏工作,一直到大陆解放后还必须做下去。
甚至与翠平生离死别,没有得到个人最佳结局。

“做事做的好,干活干到老”和“让自己有价值”这两句话间并没有矛盾。

价值是体现在关键处,是一个至关重要的地方才要突然爆发的。而无关痛痒时,尤其是做些没功劳只有苦劳的活,别做太好。

永远干得好,就会一直干下去。若让人觉得,你只有做庸碌工作的才能,就算干到累死,你也没有爬上去的那一天。



16、一定要有缺点。
在职场,一定要有缺点。即使象余则成这样,也并非完美,他会故意暴露一些缺点给人看,譬如感情,譬如贪财等。

一个完美而毫无缺点的人,为遭人嫉恨,会被人敬而远之。如果连上司都对你敬而远之,那职场之路就危险了。
所以聪明人会故意暴露些缺点,尤其是无关痛痒的缺点,让上司以为他能拿捏住你,那才是最安全的境地。

但缺点绝不可致命,却不能是你真正的短处,只可以是风花雪月时谈起的余兴节目,和人套近乎有余,想以此要挟则没门。



17、高你半级的人,往往是最危险的,同级的是天然敌人。
如果已经有一官半职,那对这句一定感同身受。
象余则成那样,比他高半级的马奎、陆桥山甚至李涯都十分危险,处处拿他当假想敌。

因为高你半级的人会有危机感,怕你随时都可能与他们平起平坐,所以有机会他们就会打击你。而不管高半级还是一级,都是上司,他们给你穿小鞋就危险万分了。
而同级的人是必然的敌人,只要你们的上司不是傻瓜,就一定会挑拨手下争斗。
这是中国五千年来的帝王术,是国粹。



18、十句里要有九句真话,这样说一句假话才有人信。
这是《潜伏》里很明显的情景。余则成说话并不总是假的,反倒有九句是真话。正是这样,他才能得到站长的信任,以致于连去台湾都要带着他。

职场中,九真一假也是最佳法则。一个满嘴跑火车的人是得不到上司信任的,只有忠心耿耿,几乎不说谎的人,才能够在最关键的时刻骗到所有人。

你要当老实人,老实人才能取信于人,没有别人的信任就没有关键时的谎言。
说谎只需要在最最关键的时刻,能少说一句就少说一句。
狼来了的故事,大家都应该听过。



19、把每个慌话都当成性命攸关,这样说谎就不会内疚。
职场上很关键的难关,就是怎么过自己心理关口。有些人天生不会说谎,一说谎就内疚。
这时候,就需要想起你的大志了。当一个人有志向,有理想,有信仰的时候,他就可以做任何事情。

余则成为了完成任务说过谎,杀过人,也做过很多坏事。这完全因为他有信仰在支撑,所以并不会内疚。
而你也要记住,每个谎言都可能是性命攸关,如果过不了自己的心,就可能实现不了自己的理想。

如果这么想了,你还会内疚么?



20、每个人都站在恶的那一面,因为各人有各人的善。
最后讲一句关于理想的道理。每个人都有自己的理想,而有利于自己理想的则是善,不利于别人理想的则是恶。
因人们各有各的立场,有不同的需求。所以在别人眼里,你必然站在恶的那面。
你永远都是自己的善,别人的恶。

但怎么样才是真正的大善,怎么样才是大恶呢?
为实现理想说一句谎,这是恶,但不是大恶。
而如果你的理想是毁灭世界,那才是大恶。
譬如你以事业红火,同事幸福为理想,那么就算为这个理想做了坏事,也不过小恶。
行大善而为小恶,历来被圣人们不齿。
可圣人自己也这么做。如此的圣人可以从孔子、孟子、王阳明一直排到更近更近。
儒教里有知行合一的法门,就是要你明白,只要理想大善,便可无所不为。

然而,
你必须真的确信自己的志向是善的。
就像余则成一样善。