《项目经理应该知道的97件事》笔记(3)

11. 你们的问题,我不买单

在甲乙双方的合作中,想清楚不应该为甲方的问题买单不是个容易的事。但想清楚之后,怎样不落入另一个极端其实也不是个容易的事。

说了甲方的问题我不买单之后呢,把一切问题都推给甲方吗?那只好等着项目崩盘了。

谁的问题谁买单,但“明确到底是谁的问题”,应该明确这是乙方的责任。实现明确了,双方认可了,真正出现时才是甲方的责任;除此之外的一切情况,都应由乙方承担。

12. 如何发现优秀的IT开发人员

招聘是玄学,也是科学。

掌握正确的理论知识、熟悉业务领域、能应用、有沟通和社交能力,这些都是老生常谈。最打动我的一条是关于正确工作态度的理解:

  • 既有创造高端产品的热情,又接收项目的限制条件

成熟的必要条件总是少不了中庸二字。

13. 优秀与普通的天壤之别

用五倍的工资招一个人,让他干十个人的活,成本降下来,这是其一。

如无必要勿增实体,如有必要努力减少实体,少一个错的人,就少一个错的人给你挖坑,这是其二。

有没有魄力去分析一下到底谁优秀谁普通,万一你的项目就是个体力活,五倍的工资也只能出一倍的效率呢?这是其三。

其实说到底还是个问题域分解的问题,只有把问题域等价的拆分下来,才能知道什么是你需要的技能,谁是你需要的优秀人才。

14. 规模决定一切

一切的一切都源自于人类太笨,如果脑容量大到你能掌握每一行代码细节,什么问题都没了。

也不好说,毕竟还有机会成本在,还要在脑容量无限大上面加一条效率无穷高。

既然做不到,那就拆分吧,分而治之的核心在于,把项目拆分成规模足够小以至于能完全理解的模块,并且,这些模块怎样组合成整体也是个规模足够小的问题。

石猴是怎么当的美猴王?前面是水帘洞,你要“钻进去”、“寻个源头”、“出来”、“不伤身体”。

基本功还是在抽象能力的基础上能做等价的问题域拆分与合并吧,越来越发现,一支笔等于笔杆+笔芯+笔帽这件事,不是谁都能理解。

15. 记录工作流程,然后严格执行

有多少项目,连记录工作流程都做不到?

哪怕有份工作日志呢?

16. 剔除多余的工作流程

用添加检查流程的方式保证正确性,那谁去保证检查流程的正确性?

你以为你以为的就一定是你以为的吗?

你以为他以为的就一定是他以为的吗?

你以为他以为的就一定是你以为他以为的吗?

软件团队仍应该是核心+n个助理的模式。只对极为简单的、极为少量的信息共享并苛责每个人的理解是否到位。不想让其他人知道的信息,一定要保证其他人完全不知道。

 

 

java web开发框架功能点整理

完成一个crud类java项目的框架最小功能集

后端部分

MVC

基于Web的项目,MVC应该是其核心功能了。有以下问题需要解决:

  • 路由:
    解决什么样的请求交给哪个后端处理单元处理的问题。
  • data binding:
    解决把前端传来的数据(url path、字符串形式的键值对、Header中的信息、cookie中的信息等,必然是字符串)包装为Java可以使用的对象的问题。要实现的效果是,所有需求对于后端业务代码来讲都要是透明的,不要再有手动的转换过程。
    一般的MVC框架都有比较清晰完善的解决方案,但有些边角的需求,需要注意怎样实现更为简便。例如如想传入的信息是三个student,每个student都有name、id两个属相,那怎样才能在后端业务代码中直接得到一个List<Student>?
  • 模板引擎:
    解决怎样把后端的处理结果转换为html页面显示给前端的问题。
    首先解决转发给哪个模板,例如使用jsp作为模板引擎,后端处理单元就要做到可以控制跳转到哪个jsp文件。
    其次是数据显示,后端处理单元处理所得到的数据要转化为字符串然后放到html中的相应位置上。需要注意的事如何能透明的对相应数据做格式化显示,如所有日期类信息都以yyyy-MM-dd的格式显示,不需要在任何逻辑控制单元中做手动转换
  • Ajax/Json:
    越来越多的请求将以ajax的形式返回给前端。简单来说,需要解决的就是怎样把后端处理的结果透明的转换为Json数据的问题。MVC框架一般都有相应的解决方案,通过简单的声明就可以控制信息以Json形式返回。需要注意的是,Model如果不是纯粹的贫血模型,怎样控制每个字段(或get开头的函数)是否要转化为json发给前端。

 

DB

数据源管理

通过统一配置,方便的在程序的任何位置获取到数据源信息,以便于进行数据库操作。

事务管理

通过约定(每次http请求作为一次事务)或者声明式的方式进行事务管理,对逻辑代码透明。

ORM

Java Web世界中大部分的数据库操作代码都是针对某个Java模型的Crud,需要提供相应的方案进行操作。至少包括:

  • 主键查询
  • 条件查询(分页)
  • 插入
  • 通过主键更新
  • 通过主键删除

必要情况下,应支持对逻辑代码透明的插入、更新、删除时间记录,以及假删除操作。

batch

某段特定sql的执行,如初始化数据等。需要提供相应的工具类。

list

一般的项目都有无穷多的显示数据列表的功能,如果针对每个列表再去开发,工作量较大。最好用配置的方式统一支持。

框架级别功能

权限管理

对逻辑功能透明、操作级。

提供登录用户管理、操作鉴权等基本机制。

提供功能模块管理、用户管理、角色管理、角色权限管理等基本功能。

杂项工具

log

提供逻辑与物理相分离的日志记录工具。

DataUtils/StringUtils/……

项目中的各种Utils,一般找合适的开源库都能解决,没有必要重新发明一遍轮子。

前端部分

UI

基本框架

统一风格、字体字号、主页面结构(项目标题、logo)等。

页面载入中效果

UI部件

  • alert、confirm、prompt……、
  • 模态窗口(显示少量信息和显示完整页面
  • form控件:下拉列表、日期控件等……
  • 消息显示(浮动出现自动消失、固定可手动关闭、固定不可手动关闭等)
  • ……

登录页

  • 用户名密码输入
  • 子系统选择
  • 登录成功后跳转
  • 登录失败后的提示、重新输入

通用功能

  • 个人profile
  • 系统设置
  • 皮肤更换
  • ……

列表页

  • 列表显示数据
  • 查询
  • ……

表单页

  • 简单表单布局
  • 复杂表单布局
  • 各种表单控件在各种布局下的展示

信息展示页

文字与图片混合排版等

统计图表页

各类统计图表的展现与交互

 

 

 

 

tomcat配置https记录

执行java bin目录下的keytool程序,生成证书

 

keytool -genkey -alias tomcat -keyalg RSA

 

输入信息后生成成功,会保存在User/niyuzhe/目录下。也可以使用参数指定生成目录。

 

在tomcat中配置https:

 

<Connector port=”8443″ protocol=”org.apache.coyote.http11.Http11NioProtocol”

maxThreads=”150″ SSLEnabled=”true” scheme=”https” secure=”true”

clientAuth=”false” sslProtocol=”TLS” keystoreFile=”C:\Users\niyuzhe\.keystore” keystorePass=”changeit”/>

 

其中keystorePass一项要与上一步输入的密码内容一致

 

重启tomcat后,就可以使用https访问网站了

 

在应用的web.xml中配置:

 

<security-constraint>

<web-resource-collection>

<web-resource-name>securedapp</web-resource-name>

<url-pattern>/*</url-pattern>

</web-resource-collection>

<user-data-constraint>

<transport-guarantee>CONFIDENTIAL</transport-guarantee>

</user-data-constraint>

</security-constraint>

 

则该应用下所有访问都会自动跳转到8443端口,使用https访问。

 

如果需要在eclipse中运行,可以在eclipse的servers中修改settings.xml

 

maven webjar构建方法

用maven管理项目构建过程后,java部分已经有了很好的工程实践。但web静态资源仍处于复制粘贴的阶段,比较混乱。

看了一些前端工程化工具,比如webpack。但毕竟不是专职做前端的人员,感觉上手还不是那么容易。后来就找到了maven webjar这个方案。

maven webjar的大致历史貌似是,servlet 3.0规定jar包中META-INF/resources文件夹下的文件,可以作为静态资源被引用。所以就有人把常见的web库用这种方式搞成了jar包,这样的话,web静态资源也能像Java库一样被直接引用了。这位大神的官网地址在:

http://www.webjars.org/

顺着这个思路,把自己项目需要用到的静态资源也打成jar包。参考了一下webjar.org上的打包方式,源文件还是放在了src/main/resources下,在pom文件中,将这个resource目录配置到META-INF文件夹下。

[xml]

<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<targetPath>META-INF/resources/</targetPath>
</resource>
</resources>
</build>

[/xml]

比如我有public文件夹,下面有something.js文件。项目的结果为:

src/main/resources

-public

–something.js

打成jar包后,jar包的结果为:

some.jar

-META-INF

–resources

—public

—-something.js

依赖该jar的web项目,可以通过http://ip:port/[projectname]/public/something.js访问到这个静态文件。

 

wordpress全站禁止未登录用户访问

其实主要目的还是想把wp作为一个私人记录的场所。

简单查了一下,网上有个修改theme的方案:http://coolwhy1.iteye.com/blog/1897995

但这样做的话,担心哪天随手升级了theme之后这东西就失效了,然后若干秘密瞬间公之于众。

于是还是觉得插件开发比较适合这个场景。

查了一番,发现要找合适的hook点。但wp文档(https://codex.wordpress.org/Plugin_API/Action_Reference)实在是有些难懂,反正原理也明白了,本地搭建了一套环境,把值得怀疑的hook点挨个试了一下……

于是发现get_header有效。

大致代码:

function liveme_if_login() {
if (!is_user_logged_in()) {
auth_redirect();
}
}
function do_filt() {
liveme_if_login();
}
// Now we set that function up to execute when the admin_notices action is called
add_action( ‘get_header’, ‘do_filt’ );

半小时掌握世界上最好的语言的感觉真好。

Java Web开发教程——技能表(待续)

程序设计基础

设计基本流程

需要掌握思路。所有独立程序都要能转化为以下几项内容的组合

  • 顺序
  • 循环
  • 判断
  • 函数调用:区分“调用”和“实现”。在当前层面不需要考虑的内容,可先定义函数接口。如考虑新建人员信息功能时,对“保存到数据库”的需求,可视作一个函数调用。在设计数据库底层代码时再考虑如何实现。

java基本环境及IDE使用

  • Jdk的安装、环境变量设置
  • 命令行运行Java HelloWorld
  • eclipse的下载及安装运行

Java Core

基本语法

  • 所有关键字的含义
  • 程序设计基本流程的实现方式

核心类库

  • java.lang下的大部分包
  • String类的常用方法,及StringBuilder等相关类
  • java.util.concurrent并发程序的编写

subversion

  • 安装tortoiesSvn,并配置使用命令行svn
  • 安装eclipse插件 subversion
  • 从服务器下载文件夹到本地
  • 分辨哪些是本地待提交的数据
  • 更新
  • 提交及编写提交注释
  • 查看资源历史记录
  • 理解资源冲突,解决冲突
  • 在服务端复制或移动资源(要求保留历史记录)

除了在服务端的操作外,要求掌握命令行操作、tortoiseSvn及eclipse三种方式

maven

  • maven基本概念
  • eclipse中建立maven简单项目,编写hello world,在eclipse中运行
  • 在命令行中将maven项目打成jar包,并运行

http basic

  • http基本流程。能把所有流程抽象为请求(url+参数(名称/值))+响应,并解释清楚。
  • 采用任何一种基于http的技术开发,都要能说明每一行代码是在前端运行还是在后端运行

java web

  • tomcat的安装和运行
  • 改变tomcat端口
  • eclipse中建立maven web项目,编写简单的jsp页面,在eclipse中使用tomcat插件运行
  • 在eclipse中、及在命令行中用maven将web项目打成war包,放到tomcat中运行
  • servlet基本概念
  • jsp基本概念
  • 理解:jsp是后端程序而不是前端程序
  • 理解:jsp本质上是servlet。并说明jsp如何转化为servlet
  • jstl常见标签的使用,if、when、foreach等
  • mvc框架的基本使用:对于需要使用的mvc框架,能说明其数据绑定方式。要求至少包含数字、字符串、日期、数组、对象几种类型。

Db

Mysql

  • 安装
  • 通过命令行的MySQL程序访问数据库
  • 创建数据库
  • 创建表
  • 插入数据
  • 创建数据库用户、修改密码、分配权限

Jdbc&Mybatis

  • Java 控制台项目,任意一张表,使用Mybatis进行增删改查操作

其它类库

slf4j及logback

  • 理解常见日志的级别及含义
  • 理解为什么要有slf4j和logback两个东西,在程序中应当用哪个api
  • 理解现行程序中创建Logger的方式、目的
  • 配置在控制台中显示log
  • 配置在文件中显示log
  • 配置任一类的log、任一包下的所有log以任意级别显示
  • 配置日志显示格式,如显示几层堆栈、是否显示线程id等

Linux basics

  • ssh登录linux
  • 理解linux权限模型
  • 理解linux目录结构
  • 基本文件操作:切换当前目录、创建目录、创建文件、删除文件、删除整个目录
  • 运行程序
  • chmod修改权限

servlet在同一域下jsession冲突问题现象记录之二

重新想了想 http://nonesuccess.me/?p=363 中的现象,梳理一下思路,解决一些上次没解释请的问题。

我最初的想法类似于朴素的字符串前缀规则,端口是比域次一级的概念,但是比path高一级,因为排在前面……根据经验,同端口是存在cookie共享的,所以path也一定存在。

经过上次的测试,这个结论是错误的。同域下的同个webapp共享cookie,涉及到不同端口时,就是同名webapp共享cookie。但是不同名的webapp不会共享。

但是仔细分析一下,道理上还是讲不通。webapp是服务端servlet下的概念,浏览器并不知道服务端的架构,因此用webapp是否是一个或者是否同名,显然不是这个现象的根本原因。

查了查servlet设置cookie的apihttps://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/http/Cookie.html,又查了查cookie的rfchttps://tools.ietf.org/html/rfc6265,发现cookie大致有这么几个属性:

  • domain:域
  • path:cookie适用的路径
  • maxAge:有效期
  • ……

浏览器能知道的只有domain和path,所以servlet是通过设置不同的path的手段,去控制在不同webapp之间,是否共享cookie。至于上面那些现象,只是这些手段推断出来的必然结果。

==假装分割线==

人总是不能避免将精力放在把“同名webapp共享,不同名的webapp不共享”当作结论背下来上。找到root cause不是一句简单的口号,在实践中更多的问题在于无法合理的划分做到哪一步才算是root cause,从而有了“反正也找不到根本原因,所以先背下来一个”的心态。

知止而后有定。

又一年

几年前开始,受男人女人过了xx岁就开始走下坡路和一些恶劣生活习惯的影响,慢慢觉得自己体力精力的上升期已经结束,不再能自欺说“这件事我做不到没关系,等两年自然就行了”。加上目标漫漫无期,常年处于温水煮青蛙的不安全感之中,每天活得焦虑不已。

焦虑到现在还是没有解决,揪心和绷着还是常态,不过这一年稀里哗啦的买了不少健身器材,试了试发现依然英勇。体力和精力的衰减虽然不能说是假象,但更多的还是源于焦虑抑郁的恶性循环。所以努了把力,把十五岁时定的要在十年后会做正手引体向上,会做双杠起伏的目标突击完成了。

自认为热情很高的事算是无疾而终,倍受打击的是自己根本没想明白这是个什么事。不过过程中的收获还是挺多的,借着热情劲儿,把几项娱乐项目练习得能拿得出手了,当了司机,活动半径也从四个xx里小区变成了四个区,算是进步。

生存技能上,对技术之外人的因素怎样把握有了更好的理解,不过管理上的情绪化现象仍然没有解决,冲动决策占了大多数,这点需要改进。技术上还是见招拆招,过程很惊险,但除了学了点并发常识外,想不起来有什么好说的。之前过于关注怎样支持所谓的“劣质开发人员”日常开发的问题,现在看,第一架构没有这么而简单,第二尤其是过度设计的架构没有那么重要,第三同事们的进步没有想象得那么困难。值得一喷的是,好歹也在并行实验室混过,现在才会写个多线程,挺郁闷。

项目上线了就能认识到这个世界的险恶。丑媳妇见了公婆,惴惴不安变成了被现实吊打。经历了两代程序员,运行十年的一段代码库发生了A类bug,个中滋味只有经历过才能清楚。集中加班导致生活很是混乱了一段时间,到现在也没完全恢复正常。计划中的高级职称,现在看应该完不成了。

这一年时间管理的概念很火,方法论不提,在标准上,我大概属于仅能规划眼前事物的级别,下一步的努力目标应该能较为妥善的规划半年到一年级别的未来变化。对于自己来说,工作能达到什么程度,比较清晰并且已经预计到要被现实继续吊打所以需要随时调整,其它方面就是改善自己现在高低不就的状况了。

生命不息,折腾不止。