261个Java基础问题

这是摘自《你必须知道的261个Java语言问题》的书目,大家可以对照着,排查下自己哪些还不熟悉,都是比较基础的问题
第1章 java基本概念及环境配置 .1
faq1.01 什么是面向对象程序设计? 1
faq1.02 面向对象程序设计的基本特征有哪些? 2
faq1.03 java语言是如何产生和发展的? 3
faq1.04 android与java语言有什么关系? 4
faq1.05 java se、java ee和java me有什么区别? 5
faq1.06 java语言的运行机制如何? 6
faq1.07 什么是jvm?有什么作用?工作机制如何? 8
faq1.08 什么是jre(或j2re)? 9
faq1.09 什么是jdk? 10
faq1.10 jdk、jre和jvm之间有什么区别? 11
faq1.11 什么是gc?gc的工作原理如何? 12
faq1.12 如何安装java基本开发环境jdk? 13
faq1.13 为何在jdk安装路径下存在两个jre? 16
faq1.14 jdk安装时设置path和classpath环境变量有何作用? 17
faq1.15 如何编译、运行java应用程序? 18
faq1.16 如何将程序中的文档注释提取出来生成说明文档? 20
faq1.17 怎样制作鼠标双击就可以运行的jar文件? 23
faq1.18 怎样给main(string[] args)方法的args指定参数值? 26
第2章 java编程基础 28
faq2.01 java中的标识符如何命名?可以用中文吗? 28
faq2.02 java中有哪些关键字? 29
faq2.03 用public、protected和private修饰方法有什么区别? 30
faq2.04 this关键字有什么含义?在哪些情况下应用? 31
faq2.05 super关键字有什么含义?在哪些情况下应用? 32
faq2.06 static关键字有什么含义?具体如何应用?能修饰构造方法吗? 34
faq2.07 final关键字有什么含义?具体如何应用? 36
faq2.08 instanceof关键字有什么含义?如何应用? 37
faq2.09 java中有哪些数据类型? 38
faq2.10 如何解决double和float精度不准的问题? 40
faq2.11 int和integer都可以作为整数类型,那么它们有什么区别? 43
faq2.12 float f=3.4语句是否正确? 44
faq2.13 成员变量和局部变量有什么区别? 45
faq2.14 变量之间传值时可分为值传递和引用传递,那么它们有何区别? 46
faq2.15 java中有哪些运算符?优先级如何? 48
faq2.16 在实现x和y相加时,x+=y和x=x+y两种实现方式有区别吗? 50
faq2.17 在执行与运算时,运算符&和&&有什么区别? 50
faq2.18 在实现x递增加1操作时,x++和++x有什么区别? 52
faq2.19 x?y:z格式的语句表示什么意思? 53
faq2.20 “+”操作符在java内部是如何实现字符串连接的? 54
faq2.21 ==和equals()都可用于比较两个操作数是否相等,它们有什么区别吗? 55
faq2.22 创建string对象时,使用string s=new string (“abc”)和string s=“abc”语句有什么区别? 56
faq2.23 break和continue语句有什么区别? 56
faq2.24 数组如何定义和初始化? 57
faq2.25 如何实现一维和二维数组的遍历? 59
faq2.26 如何实现数组的复制? 60
faq2.27 数组的排序算法有哪些?如何实现? 61
faq2.28 如何解决arrayindexoutofbounds exception异常? 64
第3章 java与面向对象 65
faq3.01 什么是类、对象、属性和方法? 65
faq3.02 什么是包?有什么好处? 67
faq3.03 什么是抽象类?有什么好处? 67
faq3.04 什么是接口?有什么好处? 69
faq3.05 什么是多态?有什么好处? 70
faq3.06 什么是内部类?有什么好处? 71
faq3.07 什么是匿名内部类?如何使用? 73
faq3.08 什么是封装类?有什么作用? 74
faq3.09 什么是继承?有什么好处? 75
faq3.10 使用new关键字创建对象时,为什么有时候提示找不到无参的构造方法? 76
faq3.11 抽象类和接口都可以包含抽象方法,那么它们有什么区别?使用时该如何选择? 76
faq3.12 什么是方法重写?为什么需要方法重写? 78
faq3.13 什么是方法重载?为什么需要方法重载? 78
faq3.14 构造方法是否可以被重写?能否被重载? 79
faq3.15 static修饰的方法能否在子类中重写? 80
faq3.16 在定义类时,何时需要重写object类中tostring()方法? 81
faq3.17 在定义类时,何时需要重写object类中equals()方法? 82
faq3.18 为什么在重写equals()方法时,一般都会重写hashcode()方法? 84
faq3.19 如何重写hashcode()方法? 85
faq3.20 java中动态绑定是什么意思? 87
faq3.21 java中是如何实现多态的?实现机制是什么? 88
faq3.22 创建类的对象时,类中各成员的执行顺序是什么样的? 89
faq3.23 什么是初始化块?有什么作用? 90
faq3.24 静态初始化块与非静态初始化块有什么区别? 92
faq3.25 如何调用内部类中的方法? 93
faq3.26 当内部类和外部类的成员名称相同时,如何在内部类中调用外部类的成员? 94
faq3.27 匿名内部类如何访问外部方法的局部变量或参数? 95
faq3.28 java异常处理机制是什么样的? 96
faq3.29 常见的runtimeexception异常有哪些? 97
faq3.30 java中异常处理的方式有哪些? 98
faq3.31 try-catch-finally语句块各部分的执行顺序如何? 100
faq3.32 为什么使用自定义异常?自定义异常如何使用? 101
第4章 java流和文件操作 103
faq4.01 如何获取文件的属性信息? 103
faq4.02 如何判断文件是否为空? 105
faq4.03 如何实现文件的创建、删除和移动? 105
faq4.04 如何创建和删除文件夹? 107
faq4.05 如何遍历目录中所有的文件? 109
faq4.06 如何获取文件夹大小? 110
faq4.07 什么是流?如何分类?具体包含哪些类? 111
faq4.08 如何实现字节流和字符流之间的转化? 113
faq4.09 如何判断要读的文件是否到达末尾? 116
faq4.10 如何读文件、写文件? 117
faq4.11 如何以追加的方式写文件? 118
faq4.12 如何实现文件和文件夹的复制? 119
faq4.13 如何在文件的任意位置进行读写? 121
faq4.14 使用buffered缓冲流写文件,为什么内容没有写入? 122
faq4.15 如何实现文件的分割与合并? 123
faq4.16 什么是nio?与i/o有什么区别和联系? 125
faq4.17 如何使用nio读写文件? 127
faq4.18 什么是字符编码和解码? 129
faq4.19 读写文件时为什么中文字符经常产生乱码? 130
faq4.20 如何解决filereader读文件乱码的问题? 131
faq4.21 为什么datainputstream和dataoutputstream读写文件时乱码? 132
faq4.22 如何实现文件锁定功能? 134
faq4.23 如何实现对文件和字符串加密、解密? 135
faq4.24 如何实现对文件和目录的压缩、解压缩? 139
faq4.25 如何读写properties文件? 143
faq4.26 如何读写xml文件? 146
faq4.27 如何读写xml文件中的元素属性? 151
faq4.28 如何读写csv格式的文件? 152
faq4.29 如何为图片文件生成缩略图? 154
faq4.30 如何操作excel文件? 156
faq4.31 如何操作word文件? 161
第5章 java gui编程 164
faq5.01 什么是java gui?swing与awt有什么关系? 164
faq5.02 什么是布局管理器?常用的布局管理器有哪些? 165
faq5.03 如何在窗体中显示一张图片? 170
faq5.04 如何为容器添加滚动条功能? 171
faq5.05 如何实现一个打开文件或者是存储文件的对话框? 173
faq5.06 如何实现弹出消息框的功能? 175
faq5.07 如何使用dialog对话框? 177
faq5.08 如何为按钮添加单击事件? ..178
faq5.09 如何为窗体添加关闭事件? 181
faq5.10 如何实现窗体菜单功能? 183
faq5.11 如何处理键盘输入事件? 185
faq5.12 如何处理鼠标单击事件?如何区分是左键还是右键? 186
faq5.13 如何实现鼠标右键弹出菜单的功能? 189
faq5.14 如何使用表格组件? 191
faq5.15 如何实现记事本功能? 193
faq5.16 如何实现贪吃蛇游戏? 198
第6章 java线程和序列化 208
faq6.01 线程、进程和程序有何区别和联系? 208
faq6.02 如何创建和启动一个线程? 209
faq6.03 线程的基本状态有哪些?它们之间有何关系? 211
faq6.04 什么是线程优先级?线程依据什么原则调度执行? 212
faq6.05 什么是后台线程?如何创建一个后台线程? 214
faq6.06 如何使正在运行的线程在指定时间内休眠? 216
faq6.07 如何终止一个正在运行的线程? 218
faq6.08 为何stop()和suspend()方法不推荐使用? 219
faq6.09 如何控制线程的暂停和启动? 220
faq6.10 如何实现多个线程同步? 225
faq6.11 什么是对象序列化和对象反序列化? 233
faq6.12 实现对象序列化的方法有哪些? 234
faq6.13 如何实现对象在磁盘中的存取操作? 236
faq6.14 使用objectinputstream读取对象时为什么会发生streamcorruptedexception异常? 238
faq6.15 对象中的成员哪些参与序列化?哪些不参与序列化? 241
faq6.16 如何自定义序列化和反序列化过程? 243
faq6.17 如何使用externalizable接口定制序列化过程? 247
faq6.18 在序列化类中添加serialversionuid属性有什么作用? 250
faq6.19 当序列化遭遇继承时,如何正确处理对象序列化过程? 251
第7章 java网络编程 256
faq7.01 什么是tcp/ip?什么是ip? 256
faq7.02 tcp和udp有什么区别? 258
faq7.03 什么是http?http的工作原理如何? 259
faq7.04 在socket通信时如何获取主机和客户机的ip地址? 261
faq7.05 如何利用socket实现基于tcp的通信? 264
faq7.06 如何利用socket传输中文字符? 265
faq7.07 如何在socket读取数据时使用超时设置? 267
faq7.08 如何利用socket传递对象信息? 268
faq7.09 如何利用socket实现文件传输? 271
faq7.10 如何基于socket实现聊天系统? 274
faq7.11 如何利用socket实现基于udp的通信? 278
faq7.12 如何利用udp socket技术实现ip多点传送? 280
faq7.13 如何获取internet资源的大小? 285
faq7.14 如何实现internet资源的单线程下载? 286
faq7.15 url如何通过proxy代理访问internet资源? 287
faq7.16 如何实现internet资源下载的断点续传? 288
faq7.17 如何实现internet资源的多线程下载? 290
faq7.18 如何解析internet网页内容? 293
第8章 java常用功能 296
faq8.01 如何使字符串中包含“””字符 296
faq8.02 如何实现字符串和整数之间的转化? 297
faq8.03 如何替换字符串中的字符或子字符串? 298
faq8.04 如何过滤字符串前后以及中间出现的空格? 299
faq8.05 如何对字符串中的子字符或子字符串进行截取? 301
faq8.06 如何判断一个字符串是否符合数值格式? 302
faq8.07 如何实现字符串的切割和查找? 303
faq8.08 如何实现十进制和二进制之间的相互转化? 306
faq8.09 如何将字节流转换为指定编码的字符串? 307
faq8.10 如何实现日期格式和字符串之间的转化? 308
faq8.11 string、stringbuffer和stringbuilder有什么区别? 310
faq8.12 如何获得一个随机数? 311
faq8.13 list、set和map是否继承自collection接口?有什么区别? 312
faq8.14 arraylist与linkedlist、vector的区别是什么? 313
faq8.15 hashmap和hashtable有什么区别? 314
faq8.16 如何遍历map和vector集合? 315
faq8.17 如何获取系统当前时间? 317
faq8.18 如何获得系统属性? 318
faq8.19 什么是反射机制?有什么作用? 319
faq8.20 如何读取键盘输入的信息? 322
faq8.21 如何获取当前工程目录? 323
faq8.22 如何使用java调用系统的exe文件? 324
faq8.23 如何使用java执行cmd命令? 325
faq8.24 如何使用java程序打开一个word文档? 326
faq8.25 如何使用md5和sha算法加密信息? 327
第9章 java数据库操作 329
faq9.01 什么是jdbc?有什么作用? 329
faq9.02 java与数据库的连接方式有哪些? 330
faq9.03 如何连接各种类型的数据库? 331
faq9.04 如何实现对数据库数据的查询? 335
faq9.05 如何实现对数据库数据的增加、删除和修改? 336
faq9.06 如何使用preparestatement对数据库操作? 339
faq9.07 statement和preparestatement有什么区别? 340
faq9.08 如何调用数据库中的存储过程? 341
faq9.09 如何通过jdbc-odbc桥访问access数据库? 344
faq9.10 连接oracle数据库时thin和oci方式有什么区别? 346
faq9.11 如何判断resultset结果集为空? 347
faq9.12 如何获取resultset中含有的记录数量? 348
faq9.13 如何获取resultset中n~m位置区间的记录? 350
faq9.14 如何利用resultset更新数据库数据? 351
faq9.15 如何使用like关键字实现模糊查询? 352
faq9.16 如何实现查询的分组统计和排序? 354
faq9.17 如何实现多表联合查询? 355
faq9.18 如何使用jdbc的批处理操作? 357
faq9.19 如何实现oracle字段值递增的功能? 358
faq9.20 如何处理数据表中date类型的字段? 360
faq9.21 如何向表中插入含有特殊字符的信息? 360
faq9.22 如何使用blob类型的字段存取图片? 361
faq9.23 如何使用clob类型的字段存取字符文件? 363
faq9.24 如何通过程序创建和删除数据表? 365
faq9.25 如何获取数据表的结构信息? 367
faq9.26 如何获取数据库中所有表名? 369
faq9.27 如何用程序备份和恢复数据库? 370
faq9.28 什么是事务?如何使用jdbc事务控制? 372
faq9.29 什么是jta?jta事务与jdbc事务有什么区别? 373
faq9.30 如何使用jta实现分布式事务控制? 374
faq9.31 什么是数据库连接池?工作原理如何? 376
faq9.32 如何提升sql语句的查询性能? 377
faq9.33 如何解决mysql数据库插入乱码的问题? 379
第10章 java web程序设计 381
faq10.01 什么是jsp?jsp的工作原理如何? 381
faq10.02 jsp、java和javascript有什么区别和联系? 383
faq10.03 jsp程序开发和运行环境是什么?如何搭建? 383
faq10.04 如何开发一款jsp程序? 387
faq10.05 在jsp中有哪些注释格式?有什么作用? 390
faq10.06 jsp中有哪些内建对象?分别有什么作用? 391
faq10.07 page、request、session和application有什么区别? 395
faq10.08 如何解决request.getparameter()取值乱码问题? 396
faq10.09 jsp中forward和redirect有什么区别? 397
faq10.10 如何在多个jsp页面之间传递信息? 399
faq10.11 如何解决url传递中文时出现乱码的问题? 400
faq10.12 动态include与静态include有什么区别? 401
faq10.13 什么是javabean?如何使用javabean? 402
faq10.14 什么是session?如何使用session? 403
faq10.15 如何在关闭页面时自动清除session? 405
faq10.16 什么是cookie?如何使用cookie? 406
faq10.17 如何在禁用cookie的情况下使用session? 408
faq10.18 如何在jsp中避免表单的重复提交? 409
faq10.19 如何实现jsp数据和javascript数据的交互使用? 411
faq10.20 什么是servlet?servlet与jsp有什么区别? 412
faq10.21 servlet容器的工作原理如何? 413
faq10.22 如何在servlet中使用session和application? 414
faq10.23 如何编写多线程安全的servlet程序? 415
faq10.24 如何在servlet和jsp中获取工程文件的绝对路径? 417
faq10.25 如何获取客户端浏览器和操作系统信息? 417
faq10.26 如何在web程序中实现定时运行的功能? 418
faq10.27 如何实现网站登录记忆跳转的功能? 421
faq10.28 如何将jsp动态页面转换为html静态页面? 423
faq10.29 如何实现数据分页显示的功能? 424
faq10.30 如何将jsp内容以excel或word格式输出? 431
faq10.31 如何在jsp中实现打印功能? 432
faq10.32 如何实现图片验证码功能? 433
faq10.33 如何实现饼状图、柱状图和曲线图? 436
faq10.34 如何实现进度条显示功能? 443
faq10.35 如何实现网站计数器功能? 447
faq10.36 如何发送html格式和带附件的邮件? 448
faq10.37 如何实现文件的上传和下载? 453
faq10.38 如何禁止浏览器缓存页面内容? 457
faq10.39 如何在网页中在线播放音乐和视频? 458
faq10.40 如何处理jsp页面的错误? 460
faq10.41 如何利用过滤器实现权限验证功能? 462
faq10.42 如何实现jsp防盗链功能? …464

jenkins远程部署Deploy Plugin配置

jenkins远程部署配置
1、安装Deploy Plugin插件
This plugin takes a war/ear file and deploys that to a running remote application server at the end of a build. The implementation is based on Cargo. The list of currently supported containers include:
Tomcat 4.x/5.x/6.x/7.x
JBoss 3.x/4.x
Glassfish 2.x/3.x
远程部署不包括resin啊!
插件下载地址:http://ftp-nyc.osuosl.org/pub/jenkins/plugins/deploy/1.9/deploy.hpi
版本:1.9
插件地址:https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin
登录Jenkins
选择 Jenkins->系统管理->管理插件->高级 上传插件,选择deploy.hpi文件上传,上传完成后需要重新启动Jenkins
在插件管理的已安装标签下,可以看到“Deploy to container Plugin”,证明插件安装成功
2、配置job
build已经完成打war包功能,Deploy Plugin只是负责远程部署
在“构建后操作” 选择“deploy war/era to a container”
输入下面参数:
WAR/EAR files:war包路径
Context path:空白,未填,还没弄清楚用处
Container:下拉菜单,选择容器
Deploy on failure:未勾选,还没弄清楚用处
可参考下图:
远程部署配置
部署结果:
远程部署成功
部署碰到个问题:
Jenkins控制台没有报任何错误,build也是成功的,但是就是未在远端服务器看到war包,查了资料,原来war包路径错误会导致部署失败,但是不会报错(猜想:因为此时已经build完成了,不属于build的范围,所以不会改变build结果)。
解决问题参考这个网址: http://stackoverflow.com/questions/9277223/jenkins-auto-deploy-tomcat-7
I was having the same problem, and in my case the (relative) path to the WAR file was incorrect. Apparently if you don’t have it exactly correct (it needs to be relative to the workspace root) then the deploy plugin will silently fail. In my case the path was:
target/whatever.war
Once that was fixed, I ran into a different problem in that the plugin expects to connect to the manager/text version of Tomcat Manager, rather than the manager/html version that I usually configure by default. You’ll need a line in your tomcat-users.xml file like the following:
(This is in addition to the “manager-gui” role you probably already have set up.)
Once those changes were made, the build and deployment worked just fine.

环境准备-Hadoop安装过程

环境准备
1、利用vmware安装centOS6系统
2、Window开启VMware Network Adapter VMnet8
注意:虚拟机网络类型选择NAT;安装操作系统是开启网络默认启动;获取IP为DNS自动获取;虚拟机安装成功后,关闭防火墙;检查虚拟机网络和物理机网络是否能ping通;



虚拟机ping物理主机
3、安装jdk,版本大为1.6,采用sun公司的jdk而不是openjdk
参考:《Linux下安装jdk

爆笑体育2013年第一期20130318

爆笑体育2013年第一期20130318,下班看看这个还真不错,哈哈O(∩_∩)O哈哈哈~

IT人必看颈椎保健操

IT人必看颈椎保健操–长时间一个姿势看书、玩电脑等易引发颈椎病,且男性的发病率高于女性。关注自己的健康,阻止亚健康,毕竟身体是革命的本钱嘛

关注自己的健康–阻止亚健康

cookie是什么

Cookie(复数形态Cookies),中文名称为小型文本文件或小甜饼,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。定义于RFC2109。为网景公司的前雇员Lou Montulli在1993年3月所发明。
Cookie总是保存在客户端中,按在客户端中的存储位置,可分为内存Cookie和硬盘Cookie。
内存Cookie由浏览器维护,保存在内存中,浏览器关闭后就消失了,其存在时间是短暂的。硬盘Cookie保存在硬盘里,有一个过期时间,除非用户手工清理或到了过期时间,硬盘Cookie不会被删除,其存在时间是长期的。所以,按存在时间,可分为非持久Cookie和持久Cookie。
因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么。 所以Cookie就是用来绕开HTTP的无状态性的“额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。
在刚才的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。
Cookie另一个典型的应用是当登录一个网站时,网站往往会请求用户输入用户名和密码,并且用户可以勾选“下次自动登录”。如果勾选了,那么下次访问同一网站时,用户会发现没输入用户名和密码就已经登录了。这正是因为前一次登录时,服务器发送了包含登录凭据(用户名加密码的某种加密形式)的Cookie到用户的硬盘上。第二次登录时,(如果该Cookie尚未到期)浏览器会发送该Cookie,服务器验证凭据,于是不必输入用户名和密码就让用户登录了。
cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
由于在HTTP请求中的cookie是明文传递的,所以安全性成问题。(除非用HTTPS)
Cookie的大小限制在4KB左右。对于复杂的存储需求来说是不够用的。
虽然cookies没有中电脑病毒那么危险,但它仍包含了一些敏感信息:用户名,电脑名,使用的浏览器和曾经访问的网站。用户不希望这些内容泄漏出去,尤其是当其中还包含有私人信息的时候。
这并非危言耸听,跨站点脚本(Cross site scripting)可以达到此目的。在受到跨站点脚本攻击时,cookie盗贼和cookie毒药将窃取内容。一旦cookie落入攻击者手中,它将会重现其价值。
Cookie盗贼:搜集用户cookie并发给攻击者的黑客。攻击者将利用cookie信息通过合法手段进入用户帐户。
Cookie投毒:一般认为,Cookie在储存和传回服务器期间没有被修改过,而攻击者会在cookie送回服务器之前对其进行修改,达到自己的目的。例如,在一个购物网站的cookie中包含了顾客应付的款项,攻击者将该值改小,达到少付款的目的。这就是cookie投毒。
网络信标(web beacon),又称网页臭虫(web bug),是可以暗藏在任何网页元素或邮件内的1像素大小的透明GIF或PNG图片,常用来收集目标电脑用户的上网习惯等数据,并将这些数据写入Cookie。网络信标在邮件跟踪和垃圾邮件中较为常用。

产品-项目组如何进行有效的沟通

  我们每天都在通过各种方式与人沟通,但是这些沟通是真正有效的吗?我们是否总是在不知不觉中,被沟通障碍牵绊住了前进的脚步,沉浸在消极的工作情绪之中却还不自知呢?
以下是我在工作中总结的一些沟通心得,在此与大家分享。
项目中常见的沟通方式:
通过文档沟通:
优点:不受文字数量的限制,内容具体;便于查阅存档及日后的统一管理;适合描述功能多、业务复杂的 项目;适合跨部门协作的项目;
缺点:不容易建立统一标准;面向不同角色,阅读时不容易找到重点;费时;理解成本高,沟通效率低
通过邮件沟通:
优点:打破时间和空间的限制;便于查阅记录;方便为多人发送附件;比较正式,适合报告工作进度或通 报项目状况等
缺点:正文不适宜太长;传递信息不即时(有时容易被忽略或丢失);不清楚语言环境有时容易误读;不 利于处理争议或敏感问题
通过IM沟通:
优点:沟通方便;容易消除紧张情绪;截图、发送文件方便;可多人对话;适合相熟的同事之间沟通,畅 所欲言;适合解决争议不大的问题,
缺点:容易被忽略;一些复杂的问题很难描述清楚;容易误解;查询记录时不是很方便(里面可能夹杂了 不少无关内容);不利于解决争议;过于随意,不适合说重要且紧急的问题
通过电话沟通:
优点:即时、有效,沟通效率较高;适合解决紧急但不太重要的问题
缺点:不利于传达微妙的情感;特别复杂的问题仍不容易说清楚,有可能引起误会;不方便查看图片等 (可配合IM使用);不便查找记录
面对面沟通:
优点:真实、拉近距离(很多误会可由此解开);便于说明复杂问题;沟通效率高
缺点:无记录;沟通成本略高;多人沟通时效率可能较低;一旦陷入僵局回旋余地较小(面对面沟通时心 态一定要平和,以解决问题为目的)
会议沟通:
优点:集思广益、开拓思路,更多角度了解他人的观点;适用于跨部门、协同解决问题、头脑风暴等
缺点:若方法不得当会导致效率极低(如果需要在会上做出决定,最好先提前一对一沟通,有备而来)
特点比较(世事无绝对,仅供参考):
适用环境(世事无绝对,仅供参考):
了解时间管理的人都知道,要首先关注重要但不紧急的事情;其次还要尽量处理好既重要又紧急的事情。因此在沟通中,要充分的重视文档、多人会议、面对面沟通、邮件等沟通方式。对于一个基层员工,要特别注意掌握面对面沟通和邮件沟通的方法。
总结:每种沟通方式都有各自的特点,很难彻底舍弃其中的任何一种,在工作中应该根据情况选择适合的沟通方式。
比如说:在项目开始之前,可以通过多人会议进行头脑风暴征求大家的意见;策划中撰写需求文档;文档写完后先面对面给其他项目人员讲述一遍思路,之后再配合IM、电话等方式即时解决后续问题;制作原型的过程中可以随时请大家在IM上提意见;通过邮件定期监控项目进度和问题;发现项目成员有负面情绪了,赶紧面对面沟通一下,……
项目中常见的沟通问题:
中国人的性格比较含蓄,又怕伤和气。既不善于主动提问,也不善于表达内心想法。于是项目中常遇到这样的情况:
1. 用文档代替正常沟通。
很少有PM发完文档,会快速跑过来给你讲一遍他的思路。这也是人之常情,人家都没问,干嘛自己要跑过去说呢。不过有文档的好处就是,别人看到不懂的地方会去问。
2. 用正常沟通代替文档
对于大型或复杂的项目,需要文档来解释说明,这是其他任何一种沟通方式也无法取代的。文档的缺失,不利于大家正确理解项目,也不利于发现问题。这样出来的结果很难令人满意。
3. 视觉或前端没看懂交互稿要表达的意思,或者是感到存在问题,却没有提出来。
作为交互设计师,我会尽量把交互稿做的精致些,配上详细的说明,但最后的结果总是不如预期理想。
4. 还有很多大家当初没发现的问题,制作完却成了大问题……
……
面对这些问题,我也在不断的思考解决方法,目前想到的如下:
1. 作为PM,还是要尽量写需求文档。首先,需求文档对理清PM的思路非常有帮助,可以通过它发现自己还有哪些地方没考虑周全;另一方面,它是设计的重要参考依据,靠简单的沟通不可能遍历到所有的用例和需求点;第三,文档可以帮助其他项目成员有针对性的提出问题,而不是感到困惑和无所适从。
也许有人会问,如果交互设计师从一开始就参与到项目中,甚至是参与需求的确定,还要写需求文档吗?答案是肯定的。需求文档可以规范的把需求要点有序的整理起来,对后续提高项目效率非常有帮助。
2. PM不写需求文档怎么办?
将心比心,没有人不热爱自己负责的产品。PM不写需求文档,一定有自己的立场和原因。作为项目组成员,可以总结自己在项目中需要知道和了解的问题,列出一份清单,请PM回答。相信每个PM都不会拒绝为大家回答问题吧。如果觉得对方回答的不清楚,可以继续细化问题,直至回答清楚为止。
3. 需求文档到底要写什么内容,是一个难题。到底什么样的需求文档能合理的概括重点内容,让后续工作顺利进行呢?我觉得这是一个长期的摸索过程,需要PM和交互、开发等角色一起讨论,通过长期的项目实践逐渐得到最适合当前团队、项目状况的文档格式。
前提是:PM及每一个项目成员要认识到大家是一个共同协作、平等互助的团队,而不是领导和被领导的关系。
4. PM不仅提供需求文档,还应向团队主要成员整体讲述一遍思路。前期沟通主要传递想法;中期沟通解决不断发现的问题,迭代需求;后期沟通确认问题是否得到解决。
5. 其他角色以此类推。
类似的项目如果做的多了,在这个过程中,就会逐渐形成规范机制,使得后面的工作越来越轻松。
通过沟通把握微妙的情感:
沟通过程不总是理性的,也有很多感性成分。
大家在一起工作,但又属于不同的部门或小组,时间长了,难免会产生各种小摩擦。正确的沟通,可以尽量避免这些不快,帮助我们更好的工作,或者说更快乐的工作。要想达到好的沟通效果,需要注意以下几点:
1. 放平心态。
不太计较得失,客观的看待问题,保持心情愉快……这些看起来谁都懂,做起来却困难的很,需要不停的在工作中磨练自己的心性。
2. 换位思考
你有没有对某人很不爽的时候?巧合的是,这个人十有八九对你也抱有同样的想法。对待同一个事情,每个人的立场不同,太过坚持自己的想法,就容易造成误解和矛盾。很难说谁对谁错,重要的是客观认识不同的立场,最后寻求一个好的解决方法。意气用事不会带来任何益处。
当你埋怨PM做的不好,沟通不到位的时候,有没有想想自己是不是也在犯同样的错误?自己有没有认真的把设计意图传达给视觉?每个人都有自己的难处,宽容、谅解,做好自己的事,也帮助别人做好他的事情,才能促使更好的结果。
3. 积极主动
多思考、多提问、多表达自己的意见。遇到不快的事情不要急着下结论,或是越想越歪,而是探清事情因果。其实,事情永远不像我们想的那么乐观,也不像我们想的那么悲观。
4. 真正认识沟通的意义
沟通是平等的,而不是一方强势的压过另一方。这是一个协作的时代,不是个人英雄主义的时代。
结语:沟通不是说学就能学的技能,而是通过后天不断的去领悟,去应用。我对沟通的认识还很粗浅,需要继续体会沟通之道。祝愿大家都能更有效的沟通,快乐的工作。

加班-产品成功

最近产品行业流传“唯快不破”四字诀,这话我是信的,只有实际运行的数据才能提供最可靠的指引。所以数据来得越快,方向就走得越准。敏捷发布,小步快走这些道理都是互联网产品项目的真理。问题是,单单从一个“快”字延伸出去,很容易唱一曲“爱拼才会赢”,6X12,甚至6X14之说大有市场。
加班并不可怕,至少我自己不怕加班,而且是习惯性每天多做几小时。过去五年的历史记录有两个,一是连续半年以上每周工作70+小时,另一个是带队报道车展的时候,连续四五天,每天工作16+小时。但正因为我加班很有经验,才对6X14持以异见。更直接点说,我不赞同把加班作为整个团队的一条口号,一种工作常态。
第一,产品项目以设计与开发为主,加班若要加出效率来,行政命令是没有用的,只能靠“质朴的热情”,即对项目有着发自内心的认同、喜爱与紧迫感,然而拥有这种热情的人终归是少数。让多数人陪着少数狂热者加班,会造成多数人的效率下降,状态疲惫。我们常见自上而下的以己推人……因为自己着急,就觉得所有人都该着急;因为自己全身心投入,就觉得所有人都不怕牺牲;可惜多数人的加班工时与进度收益之间并不成正比。
第二,有很大一部分工作,并不能靠加班来显著地推进,比如写出优质的代码,设计细腻的交互与精巧的算法,策划有创意的活动等等。简单来说,凡是脑力活动剧烈的工作,都要求在良好的精神状态下进行,才能保证质量。这就牵涉到第一条——部分人由于被迫加班,状态疲惫,不仅工作效率下降,质量也滑坡得厉害。可能是赶了两周工期,最后反而给项目带来更多的损失。
第三,产品项目中的每个工种都有农忙、农闲的时候。比如策划阶段,工程师的事儿就不多;到了开发阶段,设计师又得以清闲一段时间。调研和设计完成之后,我会建议PM休几天假放松一下,接下来,测试和发布阶段就得拼拼老命。因此将6X12设置为一种工作常态,这未免也太变态。我不止一次听见(其他公司)有人抱怨说,自己的活儿早就干完了,但下班后不准走,得留下来随时待命。这又是何苦……
前些日子,有件关于加班的事情让我印象深刻。我这边有一位资深工程师调换了部门,在新部门里升任主管职务,然后常常加班,累得够呛。之前不论我怎么激励整个团队,也很少见到他加班,现在却是主动大量地加班,任劳任怨。看来我以前对他“不愿意加班”的看法完全是个误解。这个例子说明质朴的热情往往来源于自我驱动,自己给自己设定目标,安排任务,“这是我的事情”。如果你的目标和任务来自上级,则驱动力大打折扣,“那是你的事情,我去帮你完成”。
可惜,强有力的自我驱动是件极为罕见的事情。有些人觉得自己不在其位不谋其政,有些人过于看重阶段性的物质奖励,有些人特别在乎自己的私人空间,有些人对项目的认同感始终提不起来,还有些人干脆对这份职业的投入度都不高。我在类似问题上困扰多年,积攒了几条经验:首先精简团队,至少是精简核心小组,参与(主持)项目的人越少,则归属感越强,不容易互相推卸责任。其次,核心小组要得到足够的授权,让他们感觉在做“我的事情”而不是“你的事情”,至少保证核心小组的自我驱动力。最后,我这个主管也要以身作则地加班,起到表率作用。
换个角度来看,加班对于产品成功真有那么重要吗?
最近恰好见一位豆瓣的朋友,问,你们加班多吗?答,一到19点办公室基本上就空了,早上通常是10点后才来上班……
这当然不能阻止豆瓣是一款好产品。
我在微博上说过一句话:2周一次小迭代,和3周一次迭代没有本质区别。产品胜出不会因为你每个版本的迭代都比别人快一周,而是你的判断更准确,设计更有效,实现更细腻。过度强调快快快,不仅令员工疲乏,也容易做不好产品减法。因为你能加班嘛,反而有更多工时去做次要需求。
我们都知道,产品并不是功能越多越强就越有竞争力。你拼命加班,飞快迭代,发布各式各样的型号版本,把自己搞得鸡血沸腾,但最终决定胜负的并不是速度,而是精度。拿我很钦佩的Instagram举例子,至今不开发Android版也不去完善网页端,平均一两个月才更新一个版本,不到一年用户数已经突破了700万大关!故而产品的理念与方向,比速度与激情更重要得多——但我看国内很多团队就知道抄,东抄西抄,自己的想法很少,就算有想法也往往是“抄这家”“抄那家”的贪多求全。这样的6X12,6X14又有何意义呢?真没见过几款产品单单靠“抄得快”“抄得全”就能成气候。勤不仅不能补拙,还有可能造成设计过度与产品失衡,结果越补越拙……
所以把6X12作为一句招聘提示,提前警示“有时候会非常忙哦”,这是没有问题的。但如果真心诚意这么执行下去,员工天天个个加班,时时刻刻在线,则一声叹息。从团队管理的角度上来讲,对市场与用户群的研究,尤其产品理念神马的过于飘渺,依赖超强的个人产品素质,无法用管理手段来衡量与促进,只好不得已而求其次,采用“加班”这种简单可量化的竞争手段。此法有效但不可滥用。

易成云门户开发实践总结

易成云门户开发实践总结
1、发现人员在协作开发中,存在等待现象,比如:前端开发需要model中的字段在页面中获取相应的值,但是后端开发没有做;门户后端的开发人员都应该思考:Action,Service,Model哪个该先做,这样才能协助前端展开工作。
开发的时候应该是:先接口,先model,后实现,即先model,先Action,后mock,最后Service实现;
提交任何一点代码都需要保证当前的工程是可运行的。
系统设计:
1)系统分析
2)数据模型
Done的标准
1)接口设计,输出伪代码
2)输出数据模型pdm
工作流程:
1)前后台开发人员一起根据原型,对“Action,jsp”进行分析,输出伪代码设计
2)后台开发人员对自己的业务层(Service)进行设计划分模块,列出服务清单
3)前后台分别开发,后台开发人员遵循TDD模式进行开发
发现的问题:
1.后台管理缺少原型,因此无法分辨请求是Ajax还是同步请求,返回页面还是提示也需要明确
对需求的把握的“度”的不统一:造成原因有:例如门户后端管理无原型,造成需求不明确,因此大家出现偏差,对需要的理解和执行上存在把握的“度”的不一致的问题。
解决方法:讨论时带上原型,后台管理部分的页面也需要原型设计—需要明确由谁来设计
2.前后端分离,组成两个team,而不是端到端的开发,这对大家的编程习惯是个挑战,需要我们互相学习、磨合、协作。
一、发起讨论的人必须准备的文档:
1.数据模型pdm 及相应的model代码
2.前后台接口设计的Action的伪代码
3.service与action的接口设计的伪代码
4.在wiki上发布,并邮件提醒相关参与人
二、参与讨论系统分析的人需要做的准备:
1.明确要讨论的模块的需求
2.熟悉wiki上的设计文档
2.根据文档提前列出需要明确的问题和自己的想法
三、注意事项
1.在讨论需求的时候还是需要先画出UE,这个必须有!!!!
2.需要修改则直接更新 伪代码和数据文档pdm,不必事后修改。
3.采取三三小组制,系统设计的组织形式:前台开发一人+后台开发二人 为一个小组 组与组之间的信息共享通过wiki和讨论会
4.层次较高的系统设计,仍由专人来设计、出文档,然后大家再一起讨论
5.前后端接口讨论时间:10:28-11:03 ,以后需要注意讨论的时间
四、接口设计负责人需要把你写的Action,Service,Model等类配置到spring和struts2的配置文件中 完成的标准:伪代码在框架中是可访问的,不会因为缺少配置文件而造成出现404等错误。

程序员VS编码员

程序员是脑力劳动者,编码员是体力劳动者。程序员是建筑师,编码员是泥瓦工。程序员有自主创新能力,编码员是照本宣科。
英文中 Coder 和 Programmer 都含有软件开发人员的意思,Programmer 是程序员,这个很好理解,但 Coder——这里暂且翻译成编码员——在国外有着跟程序员很大的不同。比如,在一家日本公司里,日本的软件工程师负责设计软件,编写详细说明书,制作完整的伪代码清单。他们这些人可称作是程序员。当他们完成这些事情后,设计说明书、详细说明书、伪代码等必备资料都交给中国那些外包的年轻小伙们,这些小伙阅读说明书,严格按照伪代码,把它们变换成特定语言真正可运行的代码,做这些工作的小伙只能称作编码员。可以看出,前者是用脑子的,而后者更像是一种人肉转码器。