旅行计划

去年毕业了,一直想来场旅行或者骑行,但是一直都是与想法有冲动一直没有去执行。今天在微博上看有人想去西藏,所以就想有一天能带她去西藏走走该多好呀。哪怕最后我们没有成功,来一场一个人的旅行也不错啊,但是仔细想想要去西藏还不是说能去就去的,还得提前做做准备,毕竟去的是高原地区,如果准备不足还是真有可能把命丢那里了。So,写篇日志坐下记录,最重要的是时刻提醒自己还有这么一个梦想。

准备工作:

1.资金(我觉得去一次的话没人至少要准备5K吧,虽然在来来会上这都赶上去东南亚国家旅游一个星期了)

2.锻炼身体,这个要求和自己的年度计划减肥10斤计划不谋而合了,哈哈,高原地区要有耐力嘛

3.一个旅行计划,最好还有个向导最好了。以前有个高中同学zxd在西藏边工作边旅行过,可以问问她,让她给一些建议。

4.时间安排,毕竟在工作,要结合工作时间来安排个旅行时间。

5.补充旅行方面的常识,以应付一些突发情况。

对于旅行的想法一直以来都来,一个是为了放松自己,让自己能够开阔眼界,古人说“读万卷书不如行万里路”,其实说的就是这个道理嘛,走着走着要多事情就想通了,自己的人生目标就明确了,想知道自己真正想要的是什么是自己一直想弄明白的。还有一个原因是来场自己的旅行就像自己独立地完成一件事一样,会给自己带来不一样的感受,会锻炼自己的独立能力还有想象力和创造力。

除了西藏,我还想要去的2个地方分别是美国和吴哥窟。去美国是高中就有的一个小想法,只是但是觉得不现实罢了,就没多想。想去吴哥窟主要是想去看看世界4大文明古迹,去净化自己的心灵,就像乔布斯当初去印度游学一样,艰苦忙碌而不失充实的生活会给自己带来很多顿悟。

除此之外今天在穷游折扣上看到了招聘的消息,发现这个专注于旅游的互联网公司还不错,工作环境也很开放,想想每天的工作和自己想做的事相关该是一件多么令人兴奋的事啊。不过遗憾的事,看了穷游的招聘要求和自己学的现在做的不太对口,有时间关注关注那里的岗位然后向那里靠近。嘻嘻。。。写完这些心理忽然开朗放松许多,有兴趣,有方向,有目标,一切感觉就好多了。这样在工作在做事的时候就知道自己现在为什么要这样做了,不管结果如何我们都会因为涉事而成长!

纯js脚本1k大小的3D玫瑰 程序员专用(收藏)

这是用代码做出的玫瑰花

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!doctype html>
<html>
<head>
<title>Love</title>
<meta charset="utf-8" />
<!--[if IE]>?????????????????????????????????????????????????????????????????
<![endif]-->
</head>
<body>
<canvas id="c"></canvas>
<script>
????var b = document.body;
????var c = document.getElementsByTagName('canvas')[0];
????var a = c.getContext('2d');
????document.body.clientWidth;?
</script>
<script>
????// start of submission //
????with (m = Math) C = cos, S = sin, P = pow, R = random; c.width = c.height = f = 500; h = -250; function p(a, b, c) { if (c > 60) return [S(a * 7) * (13 + 5 / (.2 + P(b * 4, 4))) - S(b) * 50, b * f + 50, 625 + C(a * 7) * (13 + 5 / (.2 + P(b * 4, 4))) + b * 400, a * 1 - b / 2, a]; A = a * 2 - 1; B = b * 2 - 1; if (A * A + B * B < 1) { if (c > 37) { n = (j = c & 1) ? 6 : 4; o = .5 / (a + .01) + C(b * 125) * 3 - a * 300; w = b * h; return [o * C(n) + w * S(n) + j * 610 - 390, o * S(n) - w * C(n) + 550 - j * 350, 1180 + C(B + A) * 99 - j * 300, .4 - a * .1 + P(1 - B * B, -h * 6) * .15 - a * b * .4 + C(a + b) / 5 + P(C((o * (a + 1) + (B > 0 ? w : -w)) / 25), 30) * .1 * (1 - B * B), o / 1e3 + .7 - o * w * 3e-6] } if (c > 32) { c = c * 1.16 - .15; o = a * 45 - 20; w = b * b * h; z = o * S(c) + w * C(c) + 620; return [o * C(c) - w * S(c), 28 + C(B * .5) * 99 - b * b * b * 60 - z / 2 - h, z, (b * b * .3 + P((1 - (A * A)), 7) * .15 + .3) * b, b * .7] } o = A * (2 - b) * (80 - c * 2); w = 99 - C(A) * 120 - C(b) * (-h - c * 4.9) + C(P(1 - b, 7)) * 50 + c * 2; z = o * S(c) + w * C(c) + 700; return [o * C(c) - w * S(c), B * 99 - C(P(b, 7)) * 50 - c / 3 - z / 1.35 + 450, z, (1 - b / 1.2) * .9 + a * .1, P((1 - b), 20) / 4 + .05] } } setInterval('for(i=0;i<1e4;i++)if(s=p(R(),R(),i%46/.74)){z=s[2];x=~~(s[0]*f/z-h);y=~~(s[1]*f/z-h);if(!m[q=y*f+x]|m[q]>z)m[q]=z,a.fillStyle="rgb("+~(s[3]*h)+","+~(s[4]*h)+","+~(s[3]*s[3]*-80)+")",a.fillRect(x,y,1,1)}', 0)
????// end of submission //
</script>
</body>
</html>

 

RMI 数据源方式

相关资料:ObjectWeb??http://rmijdbc.ow2.org/
下载驱动:RmiJdbc.jar
?
Make?your?CLASSPATH?variable?point?on?the?RmiJdbc.jar?package:?it?is?located?in?the?dist/lib?subdirectory?of?the?RmiJdbc?distribution
  • Unix?example?(bash?style):
    export?CLASSPATH=$CLASSPATH:/usr/local/RmiJdbc/dist/lib/RmiJdbc.jar
  • Windows?example:
    set?CLASSPATH=%CLASSPATH%;C:\RmiJdbc\dist\lib\RmiJdbc.jar

Start?the?RmiJdbc?Server?component:

java?org.objectweb.rmijdbc.RJJdbcServer?[-noreg]?[-port?regportnum]?[-lp?portnum]?[-sm]?[-ssl]?[driverList]

Options:

  • -noreg:?means?you?launch?the?RmiJdbc?server?with?an?external?rmiregistry.
  • -port?regportnum:?specify?the?rmiregistry?port?(optional,?useful?if?you?launch?rmiregistry?on?a?port?of?your?own).
  • -lp?portnum:?specify?the?listener?port?for?remote?objects?(optional,?useful?if?need?to?use?a?single?port?for?remote?objects?-?otherwise,?dynamically?allocated?ports?are?used).
  • -sm:?use?the?standard?RMI?SecurityManager?(otherwise,?a?relaxed?SecurityManager?is?used,?equivalent?to?the?RMI?SecurityManager?with?AllPermissions?set).
  • -ssl:?use?in?SSL?mode?(see?documentation?for?details).
  • driverList:?list?of?JDBC?Driver?classes?available?on?your?server?(ex.?org.enhydra.instantdb.jdbc.idbDriver).?You?can?also?declare?your?driver?list?in?the?jdbc.drivers?system?property?(java?-Djdbc.drivers=driverList?RmiJdbc.RJJdbcServer).

Then,?a?remote?JDBC?client?can?access?your?local?database!

client?code?for?example:

import?java.sql.*;

import?java.rmi.*;
import?RmiJdbc.*;
import?java.net.InetAddress;
/**?*?This?is?a?sample?program?for?RmiJdbc?client/server?jdbc?Driver?*?RmiJdbc?relies?on?Java?RMI?for?jdbc?objects?distribution?*/
public?class?TestClient?{?
?public?static?void?main(String[]?args)?{????
??????try?{??????
???????????//?Register?RmiJdbc?Driver?in?jdbc?DriverManager??????
??????????//?On?some?platforms?with?some?java?VMs,?newInstance()?is?necessary...?????
???????????Class.forName("org.objectweb.rmijdbc.Driver").newInstance();??????
???????????//?Test?with?InstantDB?java?database?engine??????
???????????//?See?http://www.lutris.com/products/instantDB/index.html??????
????????????//?for?info?&?download?????
????????????String?url?=?"jdbc:idb:sample.prp";??????//?RMI?host?will?point?to?local?host?????
??????????String?rmiHost?=?new?String(???????"//"?+?InetAddress.getLocalHost().getHostName());??????
???????????//?RmiJdbc?URL?is?of?the?form:?????
??????????//?jdbc:rmi://<rmiHostName[:port]>/<jdbc-url>??????
??????????java.sql.Connection?c?=?DriverManager.getConnection("jdbc:rmi:"???????+?rmiHost?+?"/"?+?url);?????????????java.sql.Statement?st?=?c.createStatement();?????
????java.sql.ResultSet?rs?=?st.executeQuery("SELECT?*?FROM?import1");????
???????java.sql.ResultSetMetaData?md?=?rs.getMetaData();????
???????while(rs.next())?{???????
??????????????????System.out.print("\nTUPLE:?|?");??????
??????????????????for(int?i=1;?i<=?md.getColumnCount();?i++)?{????????
?????????????????????????????????System.out.print(rs.getString(i)?+?"?|?");????????}??????
??????????????????????}??????rs.close();??
????????????????????}?catch(Exception?e)?{??????e.printStackTrace();????}??}};
?
和Spring集成的方式(首先也需要Start?the?RmiJdbc?Server?component):
1.加入相应的Jar包
2.在applicationContext.xml中加入bean
?????<bean?id="wldtDataSource"class="org.springframework.jdbc.datasource.DriverManagerDataSource">
???????????????<property?name="driverClassName">
?????????????????????<value>org.objectweb.rmijdbc.Driver</value>
????????????</property>
???????????<property?name="url">
???????????????????<value>jdbc:rmi://172.20.52.26/jdbc:odbc:SiteWeaver</value><!--java默认1099端口-->
??????????</property></bean><bean?id="wldtjdbcDAO"?class="com.thunisoft.summer.dao.jdbc.JdbcDAO">
?????????<property?name="dataSource">
????????????????????<ref?bean="wldtDataSource"?/>
????????</property>
?</bean>
3.在DAO层注入数据源
????????private?JdbcTemplate?getWldtJdbcTemplate()????{??????
????????????????return?((JdbcDAO)?AppContext.getInstance().getAppContext().getBean(?"wldtjdbcDAO")).getJdbcTemplate();????}
其中JdbcDAO继承了?JdbcDAO?extends?JdbcDaoSupport?在其中注入了相应的数据源,方便调用其提供的模版方法template
?

4.在RMI的server端还需要设置ODBC数据源

如图:

30天学习30种新技术系列

原文地址:http://segmentfault.com/a/1190000000349384

编者注:我们发现了比较有趣的系列文章《30天学习30种新技术》,准备翻译,一天一篇更新,年终礼包。以下是译文,英文标题表示还未翻译,附原文链接;中文标题表示已翻译,附译文链接。

更新:全系列已经全部翻译完了~

让你30天学习30种新技术,你会觉得这是挑战吗?

img-1

我已经接受了挑战,我会在一个月的时间内每天学习一门新技术,挑战开始于2013年10月29日。下面就是我将要学习的新技术的列表,我会把每天学到的内容写出来。在我每天正常的工作之后,我会花几个小时学习一门新技术,再用一小时将今天学到的写在博客上。这项活动的目的是熟悉许多在开发者社区所使用的新技术。

我会把重点放在JavaScript及其相关技术的学习上,当然也会去了解一下像Java这类我比较感兴趣的其他技术。我也可能会在一门技术上花费好几天的时间,但我每次会选择和这门技术相关的不同的主题来讲。只要是有意义的,我将尽量展示它如何与OpenShift工作,我希望这是一次充满乐趣并能学到很多东西的旅程。(你可以在twitter上follow?我

下边是学习列表:


原文?Learning?30?Technologies?in?30?Days:?A?Developer?Challenge
翻译?SegmentFault

 

JVM调优总结-Xms -Xmx -Xmn -Xss(转载)

  1. 堆大小设置
    JVM?中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows?Server?2003?系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
    典型设置:

java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k
Xmx3550m:设置JVM最大可用内存为3550M。
-Xms3550m:设置JVM促使内存为3550m。此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:设置年轻代大小为2G。整个JVM内存大小=年轻代大小?+?年老代大小?+?持久代大小。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。

java?-Xmx3550m?-Xms3550m?-Xss128k?-XX:NewRatio=4?-XX:SurvivorRatio=4?-XX:MaxPermSize=16m?-XX:MaxTenuringThreshold=0
-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5
-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6
-XX:MaxPermSize=16m:设置持久代大小为16m。
-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。

  1. 回收器选择
    JVM给了三种选择:串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。JDK5.0以后,JVM会根据当前系统配置进行判断。

吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置:?java?-Xmx3800m?-Xms3800m?-Xmn2g?-Xss128k?-XX:+UseParallelGC?-XX:ParallelGCThreads=20
-XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。
java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k?-XX:+UseParallelGC?-XX:ParallelGCThreads=20?-XX:+UseParallelOldGC
-XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。
java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k?-XX:+UseParallelGC??-XX:MaxGCPauseMillis=100
-XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k?-XX:+UseParallelGC??-XX:MaxGCPauseMillis=100?-XX:+UseAdaptiveSizePolicy
-XX:+UseAdaptiveSizePolicy
:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。适用于应用服务器、电信领域等。
典型配置:?java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k?-XX:ParallelGCThreads=20?-XX:+UseConcMarkSweepGC?-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。
-XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
java?-Xmx3550m?-Xms3550m?-Xmn2g?-Xss128k?-XX:+UseConcMarkSweepGC?-XX:CMSFullGCsBeforeCompaction=5?-XX:+UseCMSCompactAtFullCollection
-XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

  1. 辅助信息
    JVM提供了大量命令行参数,打印信息,供调试使用。主要有以下一些:

-XX:+PrintGC
输出形式:[GC?118250K->113543K(130112K),?0.0094143?secs]

????????????????[Full?GC?121376K->10414K(130112K),?0.0650971?secs]

-XX:+PrintGCDetails
输出形式:[GC?[DefNew:?8614K->781K(9088K),?0.0123035?secs]?118250K->113543K(130112K),?0.0124633?secs]

????????????????[GC?[DefNew:?8614K->8614K(9088K),?0.0000665?secs][Tenured:?112761K->10414K(121024K),?0.0433488?secs]?121376K->10414K(130112K),?0.0436268?secs]

-XX:+PrintGCTimeStamps?-XX:+PrintGC:PrintGCTimeStamps可与上面两个混合使用
输出形式:11.851:?[GC?98328K->93620K(130112K),?0.0082960?secs]

-XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
输出形式:Application?time:?0.5291524?seconds

-XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。可与上面混合使用
输出形式:Total?time?for?which?application?threads?were?stopped:?0.0468229?seconds

-XX:PrintHeapAtGC:打印GC前后的详细堆栈信息
输出形式:
34.702:?[GC?{Heap?before?gc?invocations=7:
def?new?generation???total?55296K,?used?52568K?[0x1ebd0000,?0x227d0000,?0x227d0000)
eden?space?49152K,??99%?used?[0x1ebd0000,?0x21bce430,?0x21bd0000)
from?space?6144K,??55%?used?[0x221d0000,?0x22527e10,?0x227d0000)
to???space?6144K,???0%?used?[0x21bd0000,?0x21bd0000,?0x221d0000)
tenured?generation???total?69632K,?used?2696K?[0x227d0000,?0x26bd0000,?0x26bd0000)
the?space?69632K,???3%?used?[0x227d0000,?0x22a720f8,?0x22a72200,?0x26bd0000)
compacting?perm?gen??total?8192K,?used?2898K?[0x26bd0000,?0x273d0000,?0x2abd0000)
the?space?8192K,??35%?used?[0x26bd0000,?0x26ea4ba8,?0x26ea4c00,?0x273d0000)
ro?space?8192K,??66%?used?[0x2abd0000,?0x2b12bcc0,?0x2b12be00,?0x2b3d0000)
rw?space?12288K,??46%?used?[0x2b3d0000,?0x2b972060,?0x2b972200,?0x2bfd0000)
34.735:?[DefNew:?52568K->3433K(55296K),?0.0072126?secs]?55264K->6615K(124928K)Heap?after?gc?invocations=8:
?def?new?generation???total?55296K,?used?3433K?[0x1ebd0000,?0x227d0000,?0x227d0000)
eden?space?49152K,???0%?used?[0x1ebd0000,?0x1ebd0000,?0x21bd0000)
from?space?6144K,??55%?used?[0x21bd0000,?0x21f2a5e8,?0x221d0000)
to???space?6144K,???0%?used?[0x221d0000,?0x221d0000,?0x227d0000)
tenured?generation???total?69632K,?used?3182K?[0x227d0000,?0x26bd0000,?0x26bd0000)
the?space?69632K,???4%?used?[0x227d0000,?0x22aeb958,?0x22aeba00,?0x26bd0000)
compacting?perm?gen??total?8192K,?used?2898K?[0x26bd0000,?0x273d0000,?0x2abd0000)
the?space?8192K,??35%?used?[0x26bd0000,?0x26ea4ba8,?0x26ea4c00,?0x273d0000)
ro?space?8192K,??66%?used?[0x2abd0000,?0x2b12bcc0,?0x2b12be00,?0x2b3d0000)
rw?space?12288K,??46%?used?[0x2b3d0000,?0x2b972060,?0x2b972200,?0x2bfd0000)
}
,?0.0757599?secs]

  1. -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析。
  2. 常见配置汇总
  3. 堆设置
  4. -Xms:初始堆大小
  5. -Xmx:最大堆大小
  6. -XX:NewSize=n:设置年轻代大小
  7. -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
  8. -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5
  9. -XX:MaxPermSize=n:设置持久代大小
  10. 收集器设置
  11. -XX:+UseSerialGC:设置串行收集器
  12. -XX:+UseParallelGC:设置并行收集器
  13. -XX:+UseParalledlOldGC:设置并行年老代收集器
  14. -XX:+UseConcMarkSweepGC:设置并发收集器
  15. 垃圾回收统计信息
  16. -XX:+PrintGC
  17. -XX:+PrintGCDetails
  18. -XX:+PrintGCTimeStamps
  19. -Xloggc:filename
  20. 并行收集器设置
  21. -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
  22. -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
  23. -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
  24. 并发收集器设置
  25. -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
  26. -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。

四、调优总结

  1. 年轻代大小选择
  2. 响应时间优先的应用尽可能设大,直到接近系统的最低响应时间限制(根据实际情况选择)。在此种情况下,年轻代收集发生的频率也是最小的。同时,减少到达年老代的对象。
  3. 吞吐量优先的应用:尽可能的设置大,可能到达Gbit的程度。因为对响应时间没有要求,垃圾收集可以并行进行,一般适合8CPU以上的应用。
  4. 年老代大小选择

响应时间优先的应用:年老代使用并发收集器,所以其大小需要小心设置,一般要考虑并发会话率会话持续时间等一些参数。如果堆设置小了,可以会造成内存碎片、高回收频率以及应用暂停而使用传统的标记清除方式;如果堆大了,则需要较长的收集时间。最优化的方案,一般需要参考以下数据获得:

    • 并发垃圾收集信息
    • 持久代并发收集次数
    • 传统GC信息
    • 花在年轻代和年老代回收上的时间比例
    • 减少年轻代和年老代花费的时间,一般会提高应用的效率

 

    1. 吞吐量优先的应用:一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代。原因是,这样可以尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。
    2. 较小堆引起的碎片问题
      因为年老代的并发收集器使用标记、清除算法,所以不会对堆进行压缩。当收集器回收时,他会把相邻的空间进行合并,这样可以分配给较大的对象。但是,当堆空间较小时,运行一段时间以后,就会出现“碎片”,如果并发收集器找不到足够的空间,那么并发收集器将会停止,然后使用传统的标记、清除方式进行回收。如果出现“碎片”,可能需要进行如下配置:
    3. -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
    4. -XX:CMSFullGCsBeforeCompaction=0:上面配置开启的情况下,这里设置多少次Full?GC后,对年老代进行压缩

 

JAVA虚拟机内存区域(转载整理)

JVM的体系结构,如下图:

其中,Runtime?DataArea(运行时数据区)是整个JVM的重点,平时,由于我们编写java程序很少关心内存的释放问题,这个都是JVM来自动管理的,不过,也正是因为Java程序员把内存控制的权力交给了JVM,一旦出现泄漏和溢出,如果不了解JVM是怎样使用内存的,那排查错误将会是一件非常困难的事情。这里就大致的介绍一下JVM的这一区域。

JVM中,所有的数据和程序都存放在运行时数据区,如上图,这个区域又包括几个子区域,它们各自有各自的用途和生命周期,?MethodArea和Heap是基于JVM实例的,即JVM的每个实例都有一个它自己的方法域和一个堆;PC?Register和Stack是基于线程的,即每个线程创建的时候,都会拥有自己的程序计数器和栈;Native?Method?Stack是为虚拟机用到的Native方法服务。下面分别介绍这几个区域:

1.Heap(堆)

一个JVM实例只存在一个堆内存,对于绝大多数应用来说,Java堆是虚拟机管理最大的一块内存。Java堆是被所有线程共享的,在虚拟机启动时创建。类加载器读取了类文件后,需要把类、方法、常变量放到堆内存中,以方便执行器执行,堆内存分为三部分:

a)Permanent?Space(永久存储区)

永久存储区是一个常驻内存区域,用于存放JDK自身所携带的Class,Interface的元数据,也就是说它存储的是运行环境必须的类信息,一般被装载进此区域的数据是不会被垃圾回收器回收掉的,关闭JVM才会释放此区域所占用的内存。

b)Young?Generation?Space(新生区)

新生区是类的诞生、成长、消亡的区域,一个类在这里产生,应用,最后被垃圾回收器收集,结束生命。新生区又分为两部分:伊甸区(Eden?space)和幸存者区(Survivor?pace),所有的类都是在伊甸区被new出来的。幸存区有两个:0区(Survivor?0space)和1区(Survivor?1space)。当伊甸园的空间用完时,程序又需要创建对象,JVM的垃圾回收器将对伊甸园区进行垃圾回收,将伊甸园区中的不再被其他对象所引用的对象进行销毁。然后将伊甸园中的剩余对象移动到幸存0区。若幸存0区也满了,再对该区进行垃圾回收,然后移动到1区。那如果1区也满了呢?再移动到养老区。

c)Tenure?Generation?Space(养老区)

养老区用于保存从新生区筛选出来的JAVA对象,一般池对象都在这个区域活跃。

三个区的示意图如下:

之所以将堆内存再进行分区,主要是基于这样一个事实:不同对象的生命周期是不一样的。在Java程序运行的过程中,会产生大量的对象,其中有些对象是与业务信息相关,比如Http请求中的Session对象、线程、Socket连接,这类对象跟业务直接挂钩,因此生命周期比较长。但是还有一些对象,主要是程序运行过程中生成的临时变量,这些对象生命周期会比较短,比如:String对象,由于其不变类的特性,系统会产生大量的这些对象,有些对象甚至只用一次即可回收。试想,在不进行对象存活时间区分的情况下,每次垃圾回收都是对整个堆空间进行回收,花费时间相对会长,同时,因为每次回收都需要遍历所有存活对象,但实际上,对于生命周期长的对象而言,这种遍历是没有效果的,因为可能进行了很多次遍历,但是他们依旧存在。因此,对堆进行分区管理是采用了分治的思想,把不同生命周期的对象放在不同区域,不同区域采用最适合它的垃圾回收方式进行回收。分区之后可以提高JVM垃圾收集的效率,进而优化内存管理。

无论对Java堆如何划分,目的都是为了更好的回收内存,或者更快的分配内存。如果在堆中无法分配内存,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

2.Method?Area(方法域)

方法域实际上就是堆中的永久存储区(Permanent?Space),它还有个别名叫做Non-Heap(非堆),所以也可以将方法域看作堆的一个逻辑部分。方法域中存放了每个Class的结构信息,包括常量池、字段描述、方法描述等等。这个区域除了和Java堆一样不需要连续的内存,也可以选择固定大小或者可扩展外,甚至可以选择不实现垃圾收集。相对来说,垃圾收集行为在这个区域是相对比较少发生的,但并不是某些描述那样永久存储区不会发生GC(至少对当前主流的商业JVM实现来说是如此),这里的GC主要是对常量池的回收和对类的卸载,虽然回收的“成绩”一般也比较差强人意,尤其是类卸载,条件相当苛刻。对类的卸载需要满足下面3个条件:
1)该类所有的实例都已经被GC,也就是JVM中不存在该Class的任何实例;
2)加载该类的ClassLoader已经被GC;
3)该类对应的java.lang.Class?对象没有在任何地方被引用,如不能在任何地方通过反射访问该类的方法。

3.Stack(栈)

栈的生命周期也是与线程相同。栈描述的是Java方法调用的内存模型:每个方法被执行的时候,都会同时创建一个栈帧(Frame)用于存储本地变量表、操作栈、动态链接、方法出入口等信息。每一个方法的调用至完成,就意味着一个栈帧在栈中的入栈至出栈的过程。栈帧是一个内存区块,是一个数据集,是一个有关方法(Method)和运行期数据的数据集,当一个方法A被调用时就产生了一个栈帧F1,并被压入到栈中,A方法又调用了B方法,于是产生栈帧F2也被压入栈,执行完毕后,先弹出F2栈帧,再弹出F1栈帧,遵循“后进先出”原则。栈帧中主要保存3类数据:本地变量(LocalVariables),包括输入参数和输出参数以及方法内的变量;栈操作(Operand?Stack),记录出栈、入栈的操作;栈帧数据(Frame?Data),包括类文件、方法等等。

栈中有两种异常状况:如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果栈可以动态扩展,当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。

4.PC?Register(程序计数器)

每一个Java线程都有一个程序计数器来用于保存程序执行到当前方法的哪一个指令。对于非Native方法,这个区域记录的是正在执行的VM原语的地址,该地址指向方法域中的方法字节码,由执行引擎读取下一条指令。如果正在执行的是Natvie方法,这个区域则为空。

5.Native?Method?Stack(本地方法栈)

本地方法栈与VM栈所发挥作用是类似的,只不过VM栈为虚拟机运行VM原语服务,而本地方法栈是为虚拟机使用到的Native方法服务。它的实现的语言、方式与结构并没有强制规定,甚至有的虚拟机(譬如Sun?Hotspot虚拟机)直接就把本地方法栈和VM栈合二为一。和VM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。

这里对运行时数据区的几个逻辑组成部分做了个大致的介绍,其中,同样是存储数据的栈和堆有什么区别呢?这可能也是我们编码时容易忽略的地方。下一节来分析一下这个。

 

两种JNI方法注册方式

JNI方法注册方式有两种:

  • 通过javah产生函数头,该种方式产生的方法具有固定的格式。该方式使逆向分析人员比较容易获取java层native方法对应的本地方法。
  • 在JNI_OnLoad方法中手动注册jni方法,不易查找对应关系。

注意与RMI,WebService,CORBA(Common?Object?Request?Broker?Architecture,公共对象请求代理体系结构)的区别.

JNI的资料:

jni.pdf

 

阿里巴巴离职DBA职业生涯总结:突然35岁~(转载)

原文地址:http://www.zhdba.com/mysqlops/2012/04/17/dba-alibaba.html

导读:
去年很多朋友私下或新浪微博上在总结自己的职业生涯与职业规划,也感觉到很纠结与彷徨,尤其技术人的职业生涯,随年龄增加,一些优势逐渐丧失。4月13日数据库技术大会的主办方举行的晚宴上,也让本人支持一个大家感兴趣又贴合实际的话,话题是:三十岁后的IT人?如何抉择人生路,遗憾的是预订酒店饭桌是几个房间打通的,而不是一个大厅方式(总共:8桌),大家无法围绕在一起,为此只是小范围讨论了下,今天看到曾经阿里巴巴数据库团队的海波兄弟总结分享,非常有意义,转载给大家共同欣赏!

十五年前,你或许还不懂爱情,看Jack和Rose执手相看泪眼,只是蒙胧的心痛。十五年后,你会和谁一起走进影院,更会和谁一起,走到生命终点。
十五年前,我还不太懂技术,凭兴趣玩着C语言。十五年后,当铁达尼的旋律再次响起,我会选择和哪门技术,一起走到我职业生涯的终点。

序言
—-?回望雨中的园区,更是回望来时的路。

此时天空飘着小雨,正如丝丝织雨细如愁。我刚刚离职,一路走出园区,回望了一眼雨中阿里巴巴的大楼,思绪随着微风,四处飘散。突然想起几年前我刚到杭州哪天,也是细雨微风。我走
进城西的创业大厦,终于见识了大师Biti的风采,也从此开始我的阿里巴巴之旅。
杭州的特点,是隐匿在山青水秀之间,有很多雅至的主题饭店,团队第一次出外聚餐,就是在山间绕来绕去,最后到了一处青山环绕、绿水长流之处。Biti在会议上就“什么是架构”进行了
精彩的评论,高度已经超越普通技术人员,至今我仍记忆犹新。但不久之后,Biti调至支付宝,真是遗憾。而这让我面临了空前巨大的压力,因为Biti一走,我变成了团队级别最高的DBA。初来乍到
,入职刚满一月,忽然成为阿里系一个子公司的“首席DBA”,惊喜之余,感觉压力之大、常常令我透不过气来。不过还好,时间总一晃而过,此时此刻,刚刚走出阿里,掏出手机,拍了一张照片,
算作我在阿里的留念,更是我人生一段最重要经历的留念。

回望雨中的园区,更是回望来时之路。…………

来时之路:硅谷,IT传奇的开始。

—-?人可以依靠梦想活一段时间,但不会一直下去。

“坐落在纵横交错的高速公路之间的,是巨型的商业园区和简陋的三卧两浴的平房住宅,其间最高的建筑是变电站的铁塔和架着电话线的水泥杆子。真正的工作是员工们在简陋的、用屏风隔
开的小办公室里,眼睛盯着电脑屏幕静静完成的。每个人都试图做一些前人没有做过的东西。”
这就是李彦宏在《硅谷商战》中谈到的硅谷的样子。
曾经有两个在一家公司供职的工程师,去找硅谷著名的投资家史蒂夫·朱维森,这位资深风险投资家对他们提出网上数据库系统并不感兴趣,他问:“你们还有其他主意吗?”
其中一个叫比尔·巴迪亚的工程师就说,他还想通过因特网来提供免费的电子邮件账户,从网上广告为获取收入。10天之后,朱维森连商业计划都没要便掏出30万美元帮助他们成立了Hotmail
公司。Hotmail后来以10亿美元的天价买给了微软公司。
这在当时看来有些离谱,但这样的故事到处流传,充斥着各类励志杂志,也充满着我的心。
世界上赚钱的公司多的是,但没有哪家公司的口号是改变世界。看看现在的IT、互联网公司,每个公司的口号中几乎都包含着改变世界的梦想。而且从微软、苹果这类老一代革命家,到
Google、Facebook这类硅谷新星,也的确有很多家公司或多或少的改变了世界,或至少是深深影响了世界。
IT,互联网,这是一个传奇的行业。当我的手抚过键盘,当眼光划过满屏自己写的代码,澎湃的激情,从来都没有息灭过。但无论多大的激情最终都会有息灭的时候。人可以依靠梦想活一段
时间,但不会一直下去。
1996年,我职专毕业。职专,是差等生的代名词。职专生的梦想,一般都是成为某武侠小说的男主角,有一个酷酷的名字,有一堆惊艳的红艳。我也不例外。但这一切,在96年的夏天到来时
,突然中止了。原因我应聘到了一个很小规模的计算机培训中心—“辰星计算培训中心”。还有,我看了辰星书柜中的电脑报合订本。
有一篇故事我仍然记得,《软件辉煌》,其中详细讲述了盖茨创办微软的经历,还有Word的开发历程,……。一群大男孩,用电脑改变世界。美国,硅谷,IT界,从来都不缺这样的故事。虽
然这样的故事从来没有在东方某个伟大的国家发生过。
合上电脑报,一个想法出现在我的脑海中,哪就是我要做中国的比尔。盖茨。年轻人总有梦想,不是吗?
一年后,1997年的夏天,四个辰星公司的“核心”员工,告别辰星,踏上创业之路。四人熟读微软、乃至硅谷的历史,这些历史让他们热心沸腾。
40年前,晶体管之父肖克利博士的故乡,美国西海岸的圣克拉拉,八名怀着梦想的年轻人离开肖克利半导体实验室,创办了可谓硅谷摇篮的仙童半导体公司。这就是著名的八叛逆。而我们,
则自许“四叛逆”。
我们在和辰星仅一墙之隔的地方,买了二十台电脑,投资达十万,创办了红星计算培训中心。哪一年,我们十八岁。

光辉岁月

—-?青春总是这样苦涩,但在长长生命之中,装在记忆这个坛子里,慢慢的发醇,最后却能化为无比的感纯。这或许就是生命的魔力。

………………
梦想总是遥不可及
是不是应该放弃
花开花落又是一季
春天啊你在哪里
青春如同奔流的江河
一去不回来不及道别
只剩下(平凡)的我没有了当年的热血
看那漫天飘零的花朵
在最美丽的时刻凋谢
………………

红星的创办,让我们的年青岁月,都达到了顶峰,此后再无超越。我们在同学中间成为传奇,成为创业的典泛。甚至有同学的同学,还幕名前来,向我们请教人生。
在红星除了讲课,我们还为一些传销公司开发核算、财务软件。我还用C和汇编,写各种有趣的程序。我用汇编写过一个DOS下内存驻留的程序,写完很有成就感,自信潢潢。但转念一想,要
学的东西如此之多,不知何年何月才能学完,霎那间又充满急燥。
哪段青春岁月真是难又形容。快乐与泪水,自信与自悲,坚持与旁徨,……,各种各样的感情交织着,匆匆的,过去了,不再来。
寒来暑去,花儿谢了又开、开了又谢,时间就如同夏日傍晚的凉风,轻轻的带走了岁月,只给人留下,多样的回忆,哪怕这回忆是如此的沈重。

小学三年级时,还是1987年,我在书店看到一本书,作者是诺查丹马斯。书中详细介绍了他的一系列预言,从狮心王理查的死期,到西特勒的出现。当然,最后是1999年人类大灾难,恐怖大
王从天而降。很不巧,当时哥哥刚刚带我看完电影《超人》。超人故乡星球毁灭的特效,虽然在现在看来虽然拙劣不堪,但当时强烈震憾了我幼小的心灵。如今再看诺查丹马斯的预言,我几乎已经
看到了地球在强烈的地震、大火中,变为一片废墟。出了书店,我万念具灰。我马上找到我的一众好朋友,将这个恶耗讲给他们:“我们只剩12年好活。”,未了,看着他们一个个脸如死灰,我却
突然心情大好起来,悠载悠载的回家写作业去也。有了这种经历,使我完全相信微博上的一句话:不要向任何人诉苦,因为20%的人不关心,剩下的80%听到后很高兴。这是题外话,我们继续。
12年后,1999年到了,我却再无所谓。或许大家一起死了,比我迷茫的活着更好。曾经辉煌的红星,只不过几年,便已面目全非,曾经的朋友,分道扬镖。在千禧年来临的前夜,我和几个同
样迷茫的年青人,喝着劣质的白酒,挥洒着青春,也挥洒着生命。
青春总是这样苦涩,但在长长生命之中,装在记忆这个坛子里,慢慢的发醇,最后却能化为无比的感纯。这或许就是生命的魔力。
我相信人生是一段段例行公事,一段忙完又一段,直到尽头。在红星的大门关上哪一刻,我告诉自已,一段生命结束了,要开始新的一段了。
2000年春暖花开之际,我踏上新的征程。通过以往学员的关系,到了我市一家百年老字号—五福糕点,做学徒。强烈的急燥心理,令我急切的寻找一条可以快速发家致富之路,我当时的选择
是:糕点师。但我并没有忘记我的梦,我的盖茨之梦,我的程序员之梦。2000年周星驰贺岁片《喜剧之王》上映,其中一句“我是一个演员”,深深打动了我。我想,或许有一天,别人吃着我做的
极品慕丝,我却告诉别人:”其实,我是一个程序员”。
罗红可又先做糕点,开好利来,赚了钱再当摄影师,我也可以。成长就是这样,我的目标,已经从创办Intel的肖克利八判逆,或盖茨等世界级大腕,变成了中国人罗红。其实,极便是罗红这
样的成就,也是高高在上的。所又,我成熟了,但还不够成熟。我想成为一个不普通的人,原因就是我是一个太普通的人。
几个月后,我放弃糕点,拎起菜刀,成了一个饭店的帮厨学徒。
几个月后,我放下菜刀,在路边摆摊买精品。
几个月后,我开了一家精品店。
几个月后,精品店倒闭,我赔光了所有钱。
这就是成长的代价。路不去走,就不知道原来走不通,更不知道哪条路可以走通。
其实,在这一年左右的时间中,也不是没有收获。在饭店做帮厨学徒时,我认识一个厨师。当其他厨师都是打台球、或站在街边对着过往的美女吹口哨时,他在练习刻花,或者学习。他说,
他的目标是要上天津一所厨师大学。我们一直保持着若有若无的联系,我要看看他的坚持是否会有结果。我想,他也这么想的,他也想看看,我的坚持,会不会有结果。因为,无论在干什么,我也
从没有中断学习。我不会吃口哨,台球打的也不好,他在苦练刻花时,我通常会拿起严蔚敏《数据结构》、同济大学版的《离散数学》等等。从96年到现在,从我看完比尔。盖茨故事哪一刻起,无
论的目标如何变化,我可以自豪的说,我的IT梦,从没有一天停止过。也从没有在哪个阶段,停止过学习。
还在五福糕点时,虽然这个决定有点晚了,但我还是决定放下DOS。开始看《Windows程序设计》这本号称Windows下的圣经。当我拿起菜刀时,同时,严蔚敏的数据结构,已经开始看第二遍了
,这本书后来成为我走北上、南下必带的书。而在精品店时,对于始终不明所又的编译原理,我也没有放弃,买了本号称龙书的,但我最终对编译原理还是不明所以。……。
4年后,那名厨师告诉我,他并没有去上厨师大学,他在北京的一家饭店,一个月已经拿到八、九千块。6年后,他仍在北京,但薪水已经到达一万五了。到我入职阿里巴巴高级数据库专家时
,他已经到了广州,薪水和我在阿里不向上下。之后,我们失去联系,不再有彼此的消息。因为我们在各自的身上,都已经找到结果。

残酷的青春

—-??在某一阶段,或许我们在寻找的和拒绝的都是自己。

中国最神密的部门是有关部门,最危险的工种是临时工。2001年的夏天,我来到郑州,到了我向往以久的事业单位,省计算中心,可惜从事最危险的职业:临时工。
从小,妈妈就教导我:“要好好学习,长大了进事业单位,有个铁饭碗。”
我问妈妈:“为什么只有事业单位才有铁饭碗,其他的就没有吗?”
“其他单位会破产啊,效益不好会倒闭,发不下工资。”妈妈没加思索的回答我。
我又不理解了,“哪会为什么事业单位就不会效益不好呢?”
“事业单位是国家吗,国家可以印钱啊。钱不够了就印。所以事业单位永远都不会缺钱。”妈妈回答我。
我想起阿甘正传中的一句话,Momma?always?had?a?way?of?explaining?things?so?I?could?understand?them.?妈妈总是有办法让我明白道理。
妈妈的目标,就是让我能进事业单位。现在,我终于进了,这多亏了一个亲戚。但我只是个临时工。我的工作是讲课,还有为其他各个大小企、事业单位开发各种程序。我在计算中心一共待
了7年,前2年,都是作为程序员,后来才转DBA。哪两年,我也为河南的不少企、事业单位开发了大大小小不少程序。现在想想,还有些后怕。常常午夜梦回,惊出一身冷汗。万一哪天我当年写的程
序有问题,会不会被跨省追捕回去。或许我下半辈子最好待在,和中国没有引渡协议的国家,才能真正安全。
事业单位大家都互喊老师,在阿里的时候,大家都互喊同学。所以后来到阿里后,感觉年青了几岁,哈哈。在事业单位,正式的愁每天无事可做,临时的愁每天有太多事要做。常常一个上午
跑两个单位解决问题,下午又要回去参加会议、讨论新软件的架构。在马不停蹄的忙碌中,我一直在考虑我将来的发展。谁都明白一个道理,如果想从一个行业中脱颖而出,只有两种常见的可能:
要么技术牛*,要么占得先手。技术牛*这个,不容易做到,所以,对我来说,取得成功的最简单方法只有一个,“取得先机”。
我们都明白一个很简单的道理,当火焰烧起来的时候,你才想到去加柴火,只能收获一堆灰烬。于是,我开始以我自己的判断,从众多的技术种类中,找到一个还在发展中的技术。
经过苦苦的寻觅,了解了众多专家学者的一直看法,我选定了承载我希望的东西—-VRML。VRML是HTML的3D版,当时一些专家预测,未来的网页,都将是这个样子的。
想想看,3D的网页,酷吧。打开网页,首先看到一扇门,用鼠标点一下,门打开了,随着鼠标的移动,你的虚拟形象走进房间,这是一个客厅,有三三两两的网友进进出出,大家互相在聊着
天,还有几个网友在角落中私聊,…………,怎么样,这样的网页够酷吧。
那是01年的仲夏,傍晚的凉风,让经历了一天酷暑的人,感到格外轻松。夕阳西下的天边,还飘着几朵云彩,恰到好处的点缀着色彩绚丽的天空。我骑着自行车,轻松的穿行在大街小巷。我
的心情格外的好,因为我刚买了一本书,是专门讲VRML的。而且,我找遍了整个书店,只找到一本关于VRML的书。这更加证实了我的猜想,VRML目前还比较小众,是一门方兴末艾的技术。只要抓住
时机,在VRML全面代替HTML前,将VRML学的比较精通。等到VRML大行其道时,我的名字将随着VRML一起,响彻全国。哈哈哈哈,……,想到末来的美好前景,我几乎忍不住要逛笑起来。但命运如同
横穿马路的汽车,在你得意忘形时,将你的梦想击的粉碎。
2004年,一晃三年过去了。HTML势头不减,Flash红遍国内,之于我的未来希望:VRML,不提也罢。这从一个测面证明,不要相信所谓专家、学者的预测。绝大多数的预测,都是错误的。就像
IBM创史人托马斯·沃森曾经作出了:“全球只需5台计算机”的预言一样。专家对未来的预测,往往是不靠谱的。企业家公开发表的预测,往往更不靠谱,他们的预测是为了对他们的产品和市场策
略作宣传。就如同早些年Larry?Ellison(拉里。埃里森)将预言未来PC将不再是主角,NC(网络计算机)都是主流。可惜早些年我不明白这些道理,浪费了几年时间。
如果能成功的抢占“先手”,无疑会以最小的代价、获得最大的成功。但是,如果你自以为是“先机”的东西没有发展起来,一切都将是竹蓝打水,一场空。
抢得“先手”固然可以使用自己更快的功成名就,但刻意的去抢,往往适得其反。成功抢得“先手”,这是上帝赐给你的礼物,可遇而不可求。这段经历让我明白,不要刻意追求快,欲速则
不达,还是一步一个脚印来得稳托。
其实仔细想一想,历史上固然有比尔。盖茨、乔布斯,有Google、FaceBook,等等人或者公司,以创新、抢先赢的市场和尊敬。但是,成功的人一定都是少数,还有更多的人,同样的才华横
溢、同样的聪明无比,但是,他们的创新、他的“先机”,都失败了。历史不会记得他们,因为,历史,是胜利者的丰碑。
硅谷的风险投资商厉害吧,他们肯定不会将钱随便投给不靠谱的人、不靠谱的项目。但是,即使经过硅谷风投认定靠谱的事,成功率仍只能达到20%左右,80%的失败者没有人会记得。
几年的坚持,几年的努力,只不过去学了一个毫无用处的东西。其实从03年开始,我就想过要放弃,我可能压错了宝、选错了方向。无数个夜晚在孤灯前学习,换来的只是毫无价值的技术!
我的内心,很不愿意承认这个实事。人有时候最难否定的,就是自己。一直坚持到04年,还是一个仲夏的傍晚。依然是凉风习习,天空依然是绚丽多姿。我沿着金水河随意的漫步,我想,是不是要
放弃了。一根接一根的抽着烟,买了几罐啤酒,一罐接一罐的喝着,夕阳将我的影子拖的老长老长。在某一阶段,或许我们在寻找的和拒绝的都是自己。你认为它错了,后来发现又对了,释然之后
你担然承认,自己执着了。错和对重要吗,关键是它过去了。
是的,过去了。
这之后不久,因为工作需要,我开始接触一个新的东西,Form和Report,是一种很少人听说的,一种叫Oracle数据库的开发语言。各种语言对我来说是驾轻就熟,除了安装配置,这两种语言
的开发,我很快就撑握了。我的历史,也因为这两个东西而转折。

灯塔:ITPUB

04、05年,我一直在做Oracle开发,主要使用的就是Form、Report,当然,还有OCI。在一些项目中使用OCI,纯粹是出于对C语言的偏爱。其实大多数我们的软件,可以全部使用Form和Report

我从开发转型为DBA,是一个很偶然的事件。04年底,在给海关做一个项目时,认识了一名搞网络的技术人员,他刚刚考过CCNP,正在向CCIE努力。当时,我从没想过要考什么认证,因此,也
不了解这些认证。听了CCIE,也没什么概念。他跟我讲,Oracle有一个很牛的认证,OCM。考过了后可以身价倍增。我回去在网上查了一下,说是当年亚州只有4名COM等等,总之就是很牛*。这个结
果令我大吃一惊,我没想到一个认证,能有如此难度与作用。从此,我开始了我的转型之路。
其实我们单位从02年就开始使用Oracle,几年下来,也基于Oracle开发了不少项目。很多地方有时也要求我们在项目交付的同时,提供容灾、高可用方案。但这些是我不肖做的。曾经的我对
SA和DBA是如此的不肖一顾,“只是搬搬机器、装装系统的民工”。我的梦想是创造,创造独一无二的程序,获得巨额风投,凭一已之力改变世界,我能,我可以。当梦想的浮华散去,我发现,8年
过去,我仍站在原地。我的盖茨
我是从备份、恢复切入到DBA这个行业的。04年底,我们为海关做了一个项目。项目完成后,我为他们搭建了DataGuard,同时,写了个脚本每周未备份DataGuard。当然,在项目软件中我也做
了个按钮,如果需要,他们可以随时点这个按钮触发对备库的备份操作。软件中还有个按钮是将备库直接激活的,激活之后,备库要重搭,并且,如果Redo文件有问题的话,激活会丢失些数据,不
过,这个项目的数据丢掉些他们可以接受。整个这些东西,我做为了高可用、容灾的方案,浓重的写进项目文档。当然,免不了介绍的天花乱缀。哪个时代,大家对Oracle都没有什么概念,你只要
能把库装上,都会有人说你牛。客户测试了备份、切换这些功能,再加上看了我天花乱缀的文档,对于灾备方案、高可用方案非常满意。我们领导后来得知这一情况后,专门问我是否有意转型做DBA
,我自然没有问题。我已经厌倦了开发,或者说,厌倦了老是为了别人的需求,开发程序。听说DBA还算轻闲,我计划转做DBA,再利用剩余时间开发自己的程序。但不可否认的是,Oracle是有它独
特的Mei力的。随着对Oracle学习的越来越深,我慢慢的发弃了我的开发梦。
这一切的转变,都是很自然的,自然到我每每想起,总觉得那是命中注定。
数万年间我和Oracle相遇了,没有早一秒,也没有晚一秒,哪也没有别的话说,唯有说一句,原来你也在这里。

海关的项目之后,我开始考虑,如何让用户的数据在切换时也可以保持不丢。最后考虑的结果很简单,就是将Redo每组中设两个成员,每个成员都在不同的存储上。但当时有记得有人说这样
做会对性能有影响,即使存放日志的两台存储一模一样。但也有人说没有影响。我在网上查了很多资料,大家的说法,莫衷一是。最后经过测试,结论很简单,有影响,但影响不大。对于这个结论
,我想大部分读者也不会满意。到底影响在什么地方呢?
每组中两个成员,每个成员在不同的存储中,存储性能是一致的。说这种情况下写Redo性能不会有影响的人,主要是认为LGWR会同时写两台存储中的两个Redo文件。如下图所示:

但是,我们考虑一点,LGWR进程只有一个,存储有两台,向A存储写和向B存储写,必然是两条语句,一个进程怎么可能同时执行两条语句呢。所以,上图不对,应该如下图所示才是:

LGWR发送命令写A存储中的RedoFile,不必等待写完成(因为是异步IO),LGWR再发送命令写B存储中的RedoFile。LGWR只有一个进程,不可能同时发命令写A存储和B存储中的两个Member,只
能逐个来。但因为I/O是异步的,向B存储中写Redo?Member,不必等向A存储中的写操作结束,而是如图中所示,有部分操作是平行的。
从总的时间消耗上看,图1中错误的理论,共耗时1.002?ms,?图2中正确的理论,共耗时1.003?ms。当然,时间是我随意加上去的,但对于现代的计算机系统,“发出一条命令”,“接收一个
通知”,消耗?0.001?ms?应该是过高的估计了。?写磁盘的1?ms,应该是差不多了,大部分数据库写日志的响应时间,应该都是几ms左右的。
通过上面两个图的分析,可以得出结论,让LGWR写两个存储,对性能有影响,但影响不会太大。多了图2中最后一阶段的操作:“B存储向LGWR发出写完成通知”。
有了这个结果,再后面的容灾架构,如果客户要求不丢数据,我都要求客户准备两套一模一样的存储,每个日志组的两个Member,分别放在不同的存储中。后来DBA逐渐增多,客户哪里,会有
自己的甲方DBA,对于灾备系统,当我提出要两台一模一样的存储时,一些客户会有疑问。我会详细解释LGWR的原理,其实,向客户解释的过程,也是传播自己思想的过程。向客户解释的原理越多,
客户对我的信任感也越强,后面的事情也越好办。
这些经历,也直接促成了我后面的学习习惯—-重视原理。虽然原理这东西很虚无,但为了更好的说服客户、取得客户的信任,有时我不得不向客户解释这些东西。
说点题外话,总有人问研究内部有什么用,我觉得最重要的作用就是,可以更好的忽悠客户。
哈哈,这是玩笑话,有用没用看自己爱好。有兴趣就去研究,没兴趣就去做别的。这个问题不必纠结。
如果真有兴趣去研究了,也一定会有回报。如果没去研究,也可以当好一名普通的DBA。
言归正传,能为客户解释这么多东西,有一个网站功不可未,就是ITPUB。我05年注册了帐号,此后,只要有疑难问题,第一时间先上PUB上搜索。PUB成为了工作、学习必不可少的网站。但是
,我很少在PUB上发表什么,因为我自己的功力尚不足,怕写出错误的东西,耽心影响大家。但看了哪么多好帖,从来没有回过帖,现在想来,也让我心中不安。于是从去年开始,我开始将这些年的
积累逐步总结出来。我相信一个道理,有一个农场主,得到了一种优良小麦种子,但他不懂得分享,只在自家的地里种这上了这种优质小麦。收获季节到来时,结果他的优质小麦表现并不如何的好
。他很不理解,就去请教一位专家。专家了解了情况好告诉他,只他自己种优质小麦,面积太小,旁边别人普通小麦的花粉,会被传播到他的优质小麦中,结果,影响了他的优质小麦的质量。第二
年,这位农场主将自己的优质小麦种子分享给旁边其他的农场主。由于有了足够大面积优质小麦的花粉,到了收获季节,大家都获得了大丰收。现在时间已经成熟,我会慢慢将一些心得分享出来,
希望和大家一起研究、一起进步、一起丰收。
在乙方工作哪段时间,对于工作,我只有一点感触。每天,我并不是为了单位而工作,我是为了自己而工作。只有自己的技能获得提升,才是关键。我会选择个别库做为观察对象,进行深入
、细致的分析,以此来煅炼技能。但人的精力是有限的,再加上单位给的福利待遇也不高,所以大部分库,只要客户不找我,我也不去找他们。
从07年开始,单位成立专门的数据库运维团队,决定让我作为团队的Leader。我的工作重点,从单纯的技术,慢慢变成了开会,参加各种会议。有些人对此乐此不疲,但我很不习惯。大家把
活推来推去,把功劳争来争去。不单要开会,还要培养新人。慢慢的,一些库分给其他人管理,使我可以专心去“开会”。很长时间里,我无心从事技术,脑子中之想着明天要参加已经开了好多天
的某项目架构大会、要最终确定下来的某事故改进会议、……。我心目中的管理会议是这样:

实际上的会议是这样:

哈哈,我承认图有点夸张。我实在不适合做扯皮这样的事。或许随着我年龄的进一步增长、技术实力的进一步加强。技术上已经没什么可学的了,活也干不动了。每天开开会,扯扯皮,还有
点意义。现在,这绝不是我想要的生活。古人都说,“学而优则仕”,我学还没有优呢,如何去入“仕”呢。
07年我技术进步缓慢,如果一直这样下去,我不知道,如果有一天单位辞掉我了,我该何去何从。没有了技术优势,一个单位的中下层管理人员,你到51JOB上搜索一下,有招聘“技术团队管
理者”这样岗位的吗。而且,计算中心是事业单位,从05年开始,我就一直谋求可以转成正式的“在编制”人员。为此,我、包括我们全家人,使用了很多方法。但是,我们的希望最后都落空了。
其实,我本来也没抱太大希望。
08年初,为了将来的发展,我决定辞职。这个决定或许已经有点晚了,但是,如果不马上行动,将来只会更晚。

在阿里巴巴遇见最好的DBA团队

我不喜欢飘泊的生活,也不喜欢新鲜的城市。只想在我家乡哪座著名古都中,像被固化在虎珀中一样去生活。但我的人生却注定要去飘泊,而且,是在三十而立之年,才刚刚开始。千万不要
刻意去选择自己的生活,因为你只能猜到开头,却猜不到结果。
我的第一站是北京,因为有朋友说可以为我介绍工作,但这份工作是Oracle讲师。我的技术还没有达到一定水平,还需要提高。这时候去做讲师,实在非我所愿。我的内心的理想目标,是去
阿里系的公司:阿里巴巴、淘宝、支付宝。这些公司“大师”级的人物层出不穷,我想也应该是很多DBA的目标。但自己投简历过去,成功可能很小,我一向不喜欢自已投简历过去。所以,在09年初
,考完OCM之后,我就一直想做点东西出来。正好一个朋友找过来,于是我们合作,很快就有了“Oracle日志挖掘研究版”这个程序。也很快的,阿里巴巴就给我打了电话。
到阿里面试是很爽的,来回的机票、酒店全部都已经订好,就好像到杭州来了个一日游。我是中午到的创业大厦,先被HR领到一个大厅里,做了一份笔试卷子,说是60分钟,但其实没有人在
旁边计时,晚一会儿也无所谓。笔试题难度不高,和网上流传的阿里巴巴笔试题差不多。做完笔试题,就是著名大师Biti的面试了。这是第一次见到Biti,个子不高,但人很精神,说话极有条理。
Biti面试时的难度也不高,大家聊的很好,就像朋友闲聊一样。所以,这趟杭州之行,让我觉得很完美,即来杭州旅了一次游,又和一些朋友聊了聊技术。
本来我计划当天晚上就回去,Biti面试完,被告知阿里巴巴B2B的技术部老大Andy想见见我,如果我时间上没有问题,HR会退掉当天的订好的机票再重新订,当晚住宿的酒店也已经安排好了。
当时很是受宠若惊,马上告诉HR没有问题。
第二天其实还是有点紧张的,不知道Andy会问我什么问题。见到Andy后才感觉,Andy人也很随合。Andy问了两个问题给我留下很深的印象,一是建立一个数据库层和应用层之间的统一中间层
,对下可以支持各种数据库是否有必要。还有一个,是如何拆分一个大数据库为多个数据库。
第一个问题,我的回答的很中庸,一个可以忽略下层数据库是什么的中间层,对性能会有影响,对开发效率、代码重用率会有提升,搞一个是有必要的,对于特别要求效率地方,仍可以使用
老的方式,一般情况下,使用中间层就可以了。我估计这是Andy当时正在考虑的问题,但后来阿里巴巴并没有大张旗鼓的搞这么个东西,我想Andy最终还是认为搞这个东西意义不大。
第二个问题,拆分数据库的方法,我曾经主导过一个大库的拆分,要求应用的每张表,都有主键。然后就像HASH分区一样,以每个表的主键为准,将数据做个HASH运算,分布到多个库中,我
直接把我做过这个项目详细说了一下。也是后来我才知道,原来阿里巴巴这边刚刚做过一个大表的拆分,拆分方法和我说的类似。
上午的面试很快就过去了,我专门让HR帮我订晚点的机票,这样,下午有时间去西湖游览一下。
这次杭州之行,给我的感觉是,杭州不错,面试很愉快,但打车很难。下午在西湖边打车,用了好久。后来才知道,在哪个时间点打车,能打到已经是运气了。
两个月后,我告别待了10个月的北京,来到杭州,入职阿里巴巴。

中国的大型互联网企业,有很多相似之处。比如说一样有入职培训,一样每年有年会,一样的有Outting,一样的嘴上说一套、底下做一套。比如公司一直在讲诚信,但在出了一些事情之后,
从公司发给我们员工的邮件来看,没有看到诚信二字。但这很正常,在我们国家,到我这个年龄,如果还相信公司说的什么或老板说的什么,哪脑袋就真有点问题了。
阿里的入职培训和其他公司一样,讲一讲企业文化,再把人拉到户外做做拓展运动,结束,没有持续性。和我一起参加入职培训的有几十人,半年内有差不多三分一离开公司,一年内大概只
剩三分之一留在公司。我和另外两个入职培训时认识的朋友合租一套三室两厅,一年后,他们都走了,只剩我自己独住一大套房子。大家来阿里的目的很简单,渡金。我的室友之一,半年后顺利跳
到了teradata。另一个是做客服的,一年后跳到另一个规模略小的互联网公司,做了客服经理。当然,我到阿里,最大的目的并不是渡金,而是学习。我的目标是成为Oracle大师,阿里孕育了哪么
多Oracle大师,到了阿里,我就和目标接近了。
但可能是我在面试时忽悠的有点过了头,阿里给了我一个很高的级别:高级数据库专家。这既让我兴奋,又让我感到无比大的压力。在我入职时的09年,整个集团的技术人员,达到这个级别
、和这个级别之上的,不过几十人而已。在B2B,高级专家之上的,只有十几个人。我们DBA团队中,只有一个人比我级别高,就是Biti。这让我的压力,稍微小了点,有什么大事,我前面至少还有
Biti在扛着。但是,一个月后,Biti就调到支付宝。我成了阿里巴巴B2B级别最高的DBA。一下子变成了“首席DBA”,我内心深入无比激动,但是,这也让我无比害怕。
来到阿里,我对自己的定位是学习、经历,我的目标,是成为技术大师,我从不会改变这个目标。但公司对我的期望,显然不是这样的。但这没有关系,这并不会防碍我学习。
在阿里的日子过的很快,好像回到了上学时代。每天三点一线,上班、到食堂、下班。DBA团队是我见过的最好的团队,几位领导对每个人都很负责,诚心实意的为每个人着想,努力为每个人
提供发展机会。大家之间没有争抢,没有钩心斗角,只有努力的做好事情。很高兴在这里渡过了快乐的近三年时光。在此,对领导、对团队中每个兄弟表示感谢。阿里的数据库维护水平,自然是没
得说的,用一句通俗的话来形容,我就像掉到了水中的海绵,如痴似渴的吸收着养份。
我到公司时,MySQL刚刚在公司有第一例非常成功的案例。之后的几年间,公司的MySQL团队从无到有,迅速壮大,MySQL的应用也是遍地开花。再之后NoSQL如同凄美的昙花,匆匆一现,却也
给公司内Oracle的应用带来不小的震动。对于开发,Oracle有如过街之鼠,几乎人人喊打。之后,一切又都归于平静和理性。NoSQL出局,MySQL重点发展,去Oracle已成必然。从11年开始,我也面
临艰难转型,根据公司情况,我决定转型到GreePlum数据仓库。但转型是困难的,几本大部头的书,一看就困。Oracle是越学越精神,一看GreePlum就瞌睡。数次不眠之夜的深思,我决定放弃转型
。我知道这对我来说意味着什么,放弃转型,也意味着要放弃这份工作。?虽然我很喜欢团队的氛围,我对团队恋恋不舍,但我仍将坚持我的方向。11年夏天,我开始筹备我的下一份工作,并计划在
12年春节的时候离开。

阿里巴巴二三事

在阿里,我见识到了Biti留下来的管理制度与管理水平。我们的数据库,很少出莫名其妙的问题。按照托尔斯泰的说法,好的数据库个个相似,差的数据库各有各的不同。好的数据库,无外
乎性能尚可,有完善的备份恢复和高可用机制、并定期测试,很少奇奇怪怪的问题,绝大多数报错、性能曲线的波动都可以找到原因,等等。差的数据库总有千奇百怪的问题、林林总总的报错、莫
明其妙的当机。
其实,达到阿里数据库的管理水平,DBA只做了一间事,就是更加关心自己负责的库。
每次性能曲线的波动,都要找到原因,甚至定位到SQL。对于新上线的SQL语句,进行严格的审查。对于大操作,格外小心。Statspack、AWR报告,要观注、观注、再观注。基本上也就这些了
吧。我把这种管理模式,叫做精细化管理。
说到这里,我想起了一件事,姥姥家住在一条古老的小巷里,在小巷南口,相隔不远有两家买锅葵(一种面饼)的,但一家门庭冷落,另一家则客流不断。很多人宁愿多花点时间排队,也要
买另外一家店的锅葵。有一次,我跟一位住在这块的老表谈起这事,为啥一家店生意清冷,另一家店生意兴隆。我老表很郑重的告诉我,“这就是用的功夫不一样。”我霎时间明白了。
当然,我见到过很多乙方公司的DBA,每个人要管几十个库,在这种情况下,根本无暇顾及什么性能指标、AWR报告,只要数据库不当、只要客户不主动来找就行了。不出事情,哪有什么功夫
去看AWR报告什么的。至于乙方的这种管理方式,我先称之为粗犷化管理。
这种粗犷化管理试,也是国情所定,我们无法改变环境,但我们可以改变的,是我们自己。我有一个朋友,初中同学。初中时学习不好,技校毕业。毕业后在工程公司做技工,其实干的活和
民工没有差别。在体验到现实的残酷后,他没有被生活磨平楞角,反而越战越勇,真正的奋斗起来。他的目标是考取注册监理师认证,很自然的,这个目标成了很多人茶余饭后的笑料。不是说这个
目标多不现实,而是,就算你考上了注册监理师,又能怎样呢?你怎么才能找到第一份监理师的工作呢?就算有证书,谁肯要一个民工做监理师呢?
面对嘲笑,我们唯一能做的事,就是努力坚持自己的方向,不要去做无谓的争辨。在干完一天烦重的工作后,他回去还要挑灯夜读。几年的坚持,他终于考上了注册监理师。就在为第一份监
理师工作发愁时,机会不期然而至,工程公司的一个朋友将他推荐到另一个公司。虽然干的活和民工没区别,但他是技校毕业,算是技工,底层实践经验丰富,又有了注册监理师证书,他成功的跳
到另一个工程公司,成为监理师。轻松完成了从民工到工程师这个华丽的脱变。而且,一切又都是如此的自然而然。两年后,他又跳到北京一家更大规模的公司。公司将他派到新Jiang,在工地上,
他巧遇以前的同事,他们还在顶着风沙,在工地上辛苦的工作。目前,他正在自学英语,他的计划是希望跳到外企。我相信他一定可以成功。
自助者天必助之,古人的经验之谈,难道都是骗人的吗。
相信有些乙方的DBA也在痛苦中迷茫,如何在粗犷化管理中,实现自己职业生涯的突围。我建议呢,可以选一两个库,以提升自己水平为目标,进行精细化管理。关注这一两个库的细节,你会
发现,水平可以更快的增加。
在阿里,我的第一次事故,让我记忆深刻。那是一次加节点操作,前期操作已经成功,最后一步在执行rootaddnode.sh脚本时,中途出错,导致OCR信息被损坏,所有节点全HANG。进行OCR恢
复后,才恢复正常。原因非常奇怪,rootaddnode.sh要调用srvctl向OCR中写入新节点信息,而srvctl因为缺少个包,执行失败异常退出了,OCR信息也被写坏了。
在进行这次加节点操作前,我在虚拟机中反反复复测试,做了大量的准备工作,但没想到,最终还是出了大事故。
从这件事后,我再做其他操作都更加仔细,特别是RAC。RAC下操作总会调用这个哪个一堆的脚本,我会先把脚本看一下,大概了解这些脚本都干点啥。就像加节点,我会先调用Srvctl?config
命令,显示一下配置信息。如果可以显示成功,再进行加节点操作。
“不要在周五做重要的事情,这会让你整个周未都没有好心情”,这是这次加节点操作给我留下的另一个忠告。
在阿里最深刻的,还是职场之道给我的震撼。在此,引用一位PUBER的发帖:
A同学,遇到问题,召集会议写报告搞风险评估,凤凤火火,完事后到处汇报心得,各部门都知道了数据部的功劳。
B同学,遇到问题,默默一个人搞定。

这B同学确实厉害,很多问题都独立搞定,A同学连?oracle的pga是啥都不知道,但他就是跟公司的高手们关系好,会求助,会推动。
当你有一天听到领导们背后议论A和B的时候,你会发现,他们一致都比较欣赏A。为什么他们会欣赏A呢?不是B是高手么?因为领导们已经长期不做技术了,观察人更喜欢观察人的沟通协调能力,像
B默默搞定问题,谁也不知道是咋回事,还以为这问题很简单呢。结果呢?B郁闷离职。。。职场故事无新鲜事,类似故事每天都在发生。
以前一直以为是故事,直到见到一个活生生的、传奇般的“A同学”。除了这位Puber提到的,我觉得“A同学”一般还要有一个特长,就是会起名字。一个普普通通的架构,起个好名字,简值
是有化腐朽为神奇的作用啊。
看一些中央领导的简历,升迁之迅速,往往让我惊叹。很多人不惑之年,都做到了高级领导,拥有数套房子和无数个情人,成功进级高帅富他爹。我一直很奇怪,人家都是怎么玩的。自从见
过“A同学”后,我了然了。“A同学们”的成功是很迅速的,他们身轻如燕,稍有青风拂过,便能乘风而起,一飞冲天。
“A同学们”也要有一定的能力,这是基础。但是,和他们的综合实力相比,他们的能力可以忽略不记。
他们可以把GDP搞的很高,但不会把国家搞的很强。
如果一个集体、一个部门甚至一个国家,越来越弱,那一定是“A同学们”太多了。
“A同学”后来跳到另一巨头民企担任很高的职位,依旧是风声水起、威风八面,于是我就知道,哪家民企的发展是到头了。如果以释伽“成、住、坏”三阶段发展论来讲,个人认为哪家民企
的“成”阶段已经过去,进入“住”阶段,如果没有“B同学”大量加入,数年之后,或许就是“坏”阶段了。
个人认为,单以职场发展来论,“A同学”值的效仿。现在的职场,好像春秋战国,即使你所待的“国家”,已经进入“坏”的阶段了,没关系,换一个国家就是。就像春秋战国时一位“士”
人的言论,是当大王、诸候好呢,还是做大臣好呢。当然还是大臣好。一个国亡了,王的结局只有死,但大臣呢,换个地方再做大臣就行了。“A同学们”,永远会受到市场追捧的。他们就像漆黑中
的萤火虫,那样的鲜明,那样的出众,那样的拉轰。
但我向来没有“A同学”的能耐,只能向“B同学”学习了。
将来做企么无所谓,有一点很关键,就是要认清自己的方向,这很重要。做管理?做技术?都行,这世界上有靠管理成功的,也有靠技术发家致富的。
你的目标可以是成为管理者、领导,但不能是“成为好逸无劳又挣钱”的人。不要幻想着每天什么活都不干,上班喝喝茶、扯扯蛋,每月工资高的让我们这些矮穷丑听到都吓的尿裤子。这样
的境界,是要有上一代打下基础才行。如果你进了ITPUB这个论坛,又看到我这篇文章,这足以证明你上一代没什么基础,就不要再做梦了,赶快起来跟我一起用DTrace+GDB研究Oracle原理才是正事

要想成为管理人员,或是领导,无外乎三种途径:
1、在公司混久了,跟着上级、甚至公司创业者一起打天下,有资历。走这条路,要看运气,跟对了人就行。
2、潜心研究技术细节,深入钻究技术,成为大牛,转而成为领导。这就是学而优则仕了。
3、有关系,家人在有关部门任职。

如果你发现自己没有跟对人,也没有关系,要想成为领导,哪就走第二条路吧。我知道很多优秀的领导,都是这样走过来的。比如我们团队的头,还有Biti,都是如此。其实,就连我所提到
的“A同学”,现在的某互联网巨头企业中高级管理人员,也是如此走过来的。
大多数离职的人对以前待过的公司都是颇有微词的。也是啊,如果不是因为待着不爽,谁愿意走呢。但我对阿里,感觉还是非常好的。因为阿里,我来到了杭州,在钱江之畔,生活了近3年时
光。在阿里,我终于实现了我的目标—-让技术更上一层楼。三年时光匆匆而过,正如一部电影所说,年华就是如此,当你不再拥有,你唯一可以做的,就是令自己不要忘记。

尾???声

站在远处,最后看了一眼雨中阿里巴巴园区漂亮的大楼,我生命的这一阶段已经过去。这是我生命中目前为止收获最多的一个阶段,感谢阿里、感谢我们的团队。

 

HR绝不会提醒24条面试“潜规则(转载)

面试中也有各种这样的规则,大部分我们只要经历多一些面试都能领会,下面24条面试潜规则,资深HR绝不会提醒求职者,也许年轻的HR都不清楚这些潜规则,你知道吗?

1、带多几份简历前往面试,没有比当被要求提供多一份简历而你却没有更能显示你缺乏准备的事了。带多几份简历,面试你的人可能不止一个,预先料到这一点并准备好会显得你做事正规、细致。

2、留心你自己的身体语言,尽量显得精警、有活力、对主考人全神贯注。用眼神交流,在不言之中,你会展现出对对方的兴趣。

3、初步印象和最后印象。最初和最后的五分钟是面试中最关键的,在这段时间里决定了你留给人的第一印象和临别印象以及主考人是否欣赏你。最初的五分钟内应当主动沟通,离开的时候,要确定你已经被记住了。

4、完整地填妥公司的表格——即使你已经有简历。即使你带了简历来,很多公司都会要求你填一张表。你愿意并且有始有终地填完这张表,会传达出你做事正规、做事善始善终的信息。

5、紧记每次面试的目的都是获聘。你必须突出地表现出自己的性格和专业能力以获得聘请。面试尾声时,要确保你知道下一步怎么办,和雇主什么时候会做决断。

6、清楚雇主的需要,表现出自己对公司的价值,展现你适应环境的能力。

7、要让人产生好感,富于热情。人们都喜欢聘请容易相处且为公司自豪的人。要正规稳重,也要表现你的精力和兴趣。

8、要确保你有适当的技能,知道你的优势。你怎么用自己的学历、经验、受过的培训和薪酬和别人比较。谈些你知道怎么做得十分出色的事情,那是你找下一份工作的关键。

9、展示你勤奋工作追求团体目标的能力,大多数主考人都希望找一位有创造力、性格良好,能够融入到团体之中的人。你要必须通过强调自己给对方带来的好处来说服对方你两者皆优。

10、将你所有的优势推销出去,营销自己十分重要,包括你的技术资格,一般能力和性格优点,雇主只在乎两点:你的资历凭证、你的个人性格。你能在以往业绩的基础上工作并适应公司文化吗?谈一下你性格中的积极方面并结合例子告诉对方你在具体工作中会怎么做。

11、给出有针对性的回答和具体的结果。无论你何时说出你的业绩,举出具体例子来说明更有说服力。告诉对方当时的实际情况,你所用的方法,以及实施之后的结果。一定要有针对性。

12、不要害怕承认错误,雇主希望知道你犯过什么错误以及你有哪些不足。不要害怕承认过去的错误,但要坚持主动地强调你的长处,以及你如何将自己的不足变成优势。

13、和过去业绩成就相关的故事,过去的成绩是对你未来成绩最好的简述。如果你在一个公司取得成功,也意味着你可以在其他公司成功。要准备好将你独有之处和特点推销出去。

14、面试前要弄清楚你潜在雇主的一切,尽量为其需要度身定做你的答案,关于公司的、客户的,以及你将来可能担任的工作,用对方的用词风格说话。

15、面试前先自己预演一下,尝试你会被问及的各种问题和答案,即使你不能猜出所有你可能被问的问题,但思考它们的过程会让你减轻紧张而且在面试时心里有底。

16、知道怎么回答棘手的问题,大部分的主要问题事前都可以预料到。但是,总会有些让你尴尬的问题以观察你在压力下的表现。应付这类问题的最好情况就是有备而战,冷静地整理好思路并尽量从容回答。

17、将你的长处转换成有关工作业绩和效益以及雇主需要的用语。如果你对自己和工作有关的长处深信不疑的话,重点强调你能够给对方带来的好处,在任何可能的情况下,举出关于对方需要的例子。

18、说明你的专长和兴趣。对雇主最有利的事情之一就是你热爱自己的业务,面试之前要知道你最喜欢的工作是什么,它会给雇主带来什么利益。

19、清楚自己的交际用语,对大部分的雇主而言,交际的语言技巧十分有价值,是受过良好教养和有竞争力的标志。清楚你自己是如何交际的,并且配合其他人一起联系你从最好方向努力去展现自己。

20、不要准时到达——要提早到!不管你的主考人对多么谅解你在路碰到的意外况,要克服负面的第一印象几乎是不可能的。尽一切能力准时,包括预先给可能发生的意外留下时间。

21、把你碰到的每一个人对看成是面试中的重要人物,一定要对每一个你接触的人都彬彬有礼,不管他们是谁以及他们的职务是什么,每个人对你的看法对面试来说都可能是重要的。

22、用完整的句子和实质性的内容回答问题。紧记你的主考人都想判断出你能为公司带来什么实质性的东西,不要只用“是的”“不是”来回答问题。给出完整的答案让人知道你和公司的要求有什么联系,让他们知道你是什么人。

23、用减轻紧张的技巧来减少你的不安,公众人物有很多舒缓压力的方法会帮助你进行面试。在面试临近时练习一下如何放松自己,譬如放慢语速,深呼吸以使自己冷静下来。你越放松越会觉得舒适自然,也会流露出更多的自信。

24、一定要准备好问问题,准备好几个和工作、雇主、以及整个机构有关的问题,这些问题应该能够获取有效信息,表达你对工作的兴趣以及智慧和热情。