About neohope

一直在努力,还没想过要放弃...

产品管理模式演化

==========================================================
最开始的时候,公司产品管理比较混乱,几乎对每一个客户都进行了定制,出现了大量的分支。
后面发现维护成本太高,开始合并各版本之间的功能,但最终仍有十几个版本。

PS:后来公司换了老板,初期很多有经验的研发及实施人员都流失了,很可惜。

==========================================================
2009年,项目比较小,我们采用的是按功能划分的方式进行分工的,经常一个项目就一个人,或一个项目拆为几大块,每人一块来进行。这个模式持续了一段时间。

现在回过头来看这段时间的一些产品,产品功能不多,但需求做的很好,产品定位比较准确,符合客户要求,后期移交其他同事维护后,架构上和界面上都没有大的变化。对于小规模的开发,这种方式还是适用的。

==========================================================
2010年底到2011年,公司开始了电子病历项目的开发,投入了不少的人力。由于项目变的比较复杂,现在变成了十来个人一起扑到一个项目上。第一次引入了需求、测试人员。本人甚至客串了一段时间的美工+前端(惨不忍睹)。

这段时间是架构转型的时间,时间紧任务重,语言也刚开始学,加了很多班,好在项目最终验收了。

后来由于很多原因,整个产品线被砍掉了,又流失了不少人。

==========================================================
2012年,开始了平台项目,初期核心团队不大,产品已经有了原型,加上前面的积累,整个任务还算顺利,但仍然是加了很多班。

架构为简单的SSH,后台逻辑为主,前端现在看来惨不忍睹。

花了很多时间,补充平台应用。

==========================================================
2013年,团队人员增加了很多,引入了MVN,开始有了较好的任务分工,架构变的明晰。

花了很多时间,把其他缺失的部分补上来,逐渐形成了一个产品线。

开始使用快速原型法。

开始引入ESB。

==========================================================
2014年,团队人员再次增加了很多,同时加上很多水平不错的同事加入,有了较好的发展。

开始推进单元测试,产品流程越来越规范,快速原型法使用的越来越多,大量使用交互稿。

很多地方开始务实,产品定位进行了调整,很多项目都开始使用ESB。

部分项目,前后端开始分离。

==========================================================
2015年,团队人员有些变动,核心团队还比较稳定。

开始推进高并发,更加关注代码质量。

补充了很多ESB的接口。

前端团队飞速成长,前后端彻底分离。

==========================================================
顺便说一下,我在2009加入公司时,研发中心除了总监,只有我一个人。初期从其他部门调来几个人员,加上招的一些人,也不足10人,现在研发中心已经接近150了。

致新人,差距是如何产生的(01)

今年,我们组来了很多的java新人(编程经验小于一年的小朋友)。

对于他们,我都会做下面的事情:

1、让他们自己列出自己的知识架构,从而告知其不断积累的重要性

90%的人只用过java语言,只知道SSH。

这里,我会结合他们大学课程、实际经验,给他们补充一部分知识架构,拓展一下视野。

并告诉他们如何去对比的学习新知识,如何找到一种适合自己的学习方式,并要找到适合自己的知识积累方式。

2、以一个很简单的例子,告诉他们应多考虑原理,而不只是用

在一个网站中,在只用了一个框架,比如struts2或spring mvc的情况下,前端登录页面的用户名、密码,是如何发送到后台,并返回验证结果到前台的。

所有人,都直接提到了action如何获取用户名及密码,但只有很少人考虑了,浏览器是如何找到服务器/容器的,也只有很少人知道,容器是如何定位到哪个应用、哪个action的。

然后,会告诉他们,希望他们可以在一年之后,用最复杂的解释,告诉我,这个流程是如何运作的。两年之后,把整个流程变简单,并可以自己去实现一个简单的框架。

3、送给他们一本《程序员的职业素养》,让他们自己去领悟其中的内容

4、探讨他们的职业发展道路

5、开始安排培训,并开始逐步解除新项目

因为,在我看来,程序员在前三年的时候,是个明显的分水岭,所用的学习方式,直接决定了他是程序员还是码农还是该转行。

2015至2016年会讲话

平台组的发言

2015年,对于我们来说是重要的一年。这一年中,一方面,我们积极配合前方的实施团队,力保项目顺利进行。在这里,需要感谢实施组、技术支持组与管理组的同事,给予我们大量的理解与支持(很多现场同事,利用了自己私人的时间,帮我们梳理流程、复现问题、复测程序,陪我们加了很多班),大家帮我们做了太多太多,我就不一一答谢了。我们计划在16年给实施、技术支持组的同事一份大礼,让大家的工作变得更加高效。

另一方面,我们在产品化及服务化方面,进行了大量的工作,并取得了一定的进展。
比如:为了解决横向扩展问题,我们引进了NginX、Redis、消息中间件。让单节点故障对项目的影响降到了最低;再配合虚拟化技术,这样可以更加高效的利用硬件资源;
再比如:为了解决文件检索问题,我们引进了NOSQL技术,(XML数据库、BSON数据库),正在引入大数据存储及计算技术,让互联网的新技术为我们服务,推动我们的产品进步,并最终让技术成为用户的价值。在这里很感谢PACS组同事,向我们分享了很多好的建议,我们有很多好的想法,都是从他们这边来的。
再比如:很感谢视觉设计组+前端组同事,改变了前后台开发的配合方式,帮我们承担了JS+CSS+HTML的调试工作,让后端的程序员专注于后端业务逻辑,让大家去处理各自擅长的事情,大量减少了后端程序员调试JS+CSS的痛苦。

很开心我们组很多同事都有了进步,有些是在技术上有了很大的进步 ,有些人成为团队的主力,有些人已经可以独当一面。这些是一点一滴积累起来的,可能自己还没有意识到。我相信,不积跬步,无以致千里;不积小流,无以成江海。我们做的每一件小事,都是最终引发质变的必要原因;我们遇到的每次困难,都是我们成长的精神食粮。我们真正需要的就是,用心做事,把事做好。不忘初心,方能长久。
我们软件人员大多很内向,话不多。但我感觉在咱们这个大家庭里,充满了温暖。能和各位一步步走来,一起进步,我感觉~真好。

Cassandra3基本操作01

1、首先看一下各节点状态

neohope@debian8-node01:~/Deploy/apache-cassandra-3.0.1$ bin/nodetool status
Datacenter: datacenter1
=======================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address        Load       Tokens       Owns    Host ID                               Rack
UN  172.16.172.23  230.25 KB  256          ?       760879a3-e06b-43bb-97bf-b045a655da9c  rack1
UN  172.16.172.24  237.17 KB  256          ?       5bf3e77d-ccf4-4f81-9465-de0babe1e0cc  rack1
UN  172.16.172.25  241.55 KB  256          ?       5a7ed53f-c8e0-4658-af9a-41880dada5ef  rack1

Note: Non-system keyspaces don't have the same replication settings, effective ownership information is meaningless

2、然后用cqlsh连接cassandra

neohope@debian8-node01:~/Deploy/apache-cassandra-3.0.1$ bin/cqlsh debian8-node01
Connected to NeoCluster at debian8-node01:9042.
[cqlsh 5.0.1 | Cassandra 3.0.1 | CQL spec 3.3.1 | Native protocol v4]
Use HELP for help.

cqlsh:neokeyspace> help

Documented shell commands:
===========================
CAPTURE  CLS          COPY  DESCRIBE  EXPAND  LOGIN   SERIAL  SOURCE   UNICODE
CLEAR    CONSISTENCY  DESC  EXIT      HELP    PAGING  SHOW    TRACING

CQL help topics:
================
AGGREGATES               CREATE_KEYSPACE           DROP_TRIGGER      TEXT     
ALTER_KEYSPACE           CREATE_MATERIALIZED_VIEW  DROP_TYPE         TIME     
ALTER_MATERIALIZED_VIEW  CREATE_ROLE               DROP_USER         TIMESTAMP
ALTER_TABLE              CREATE_TABLE              FUNCTIONS         TRUNCATE 
ALTER_TYPE               CREATE_TRIGGER            GRANT             TYPES    
ALTER_USER               CREATE_TYPE               INSERT            UPDATE   
APPLY                    CREATE_USER               INSERT_JSON       USE      
ASCII                    DATE                      INT               UUID     
BATCH                    DELETE                    JSON            
BEGIN                    DROP_AGGREGATE            KEYWORDS        
BLOB                     DROP_COLUMNFAMILY         LIST_PERMISSIONS
BOOLEAN                  DROP_FUNCTION             LIST_ROLES      
COUNTER                  DROP_INDEX                LIST_USERS      
CREATE_AGGREGATE         DROP_KEYSPACE             PERMISSIONS     
CREATE_COLUMNFAMILY      DROP_MATERIALIZED_VIEW    REVOKE          
CREATE_FUNCTION          DROP_ROLE                 SELECT          
CREATE_INDEX             DROP_TABLE                SELECT_JSON     

Continue reading Cassandra3基本操作01

HBase简单通讯代码

首先,就要说一下配置问题了。HBase客户端的配置有两种方式,一种是通过配置文件,另一种是通过代码设置。

1、配置文件方式
配置文件名称为hbase-site.xml,该文件必须放置到CLASS_PATH下面才会有效,文件示例如下:
hbase-site.xml

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<property>
		<name>hbase.rootdir</name>
		<value>hdfs://hadoop-master:9000/hbase</value>
	</property>
	<property>
		<name>hbase.cluster.distributed</name>
		<value>true</value>
	</property>
	<property>
		<name>hbase.master</name>
		<value>hdfs://hadoop-master:60000</value>
	</property>
	<property>
		<name>hbase.zookeeper.quorum</name>
		<value>hadoop-master,hadoop-slave01,hadoop-slave02</value>
	</property>
</configuration>

2、通过代码配置方式

        Configuration hbaseConfig = HBaseConfiguration.create();
        hbaseConfig.setInt("timeout", 120000);
        hbaseConfig.set("hbase.master", "hdfs://hadoop-master:60000");
        hbaseConfig.set("hbase.zookeeper.quorum", "hadoop-master,hadoop-slave01,hadoop-slave02");
        hbaseConfig.setInt("hbase.zookeeper.property.clientPort", 2181);
        hbaseConfig.setInt("hbase.client.retries.number", 1);

Continue reading HBase简单通讯代码

浏览器插件的演化

浏览器插件,主要使用了两种,一种是微软的ActiveX插件,一种是Java Applet。

说实话,两种插件的引入,主要是为了突破浏览器的本地访问限制。而且,很多控件都是内网使用,是自签名的,你懂的。

ActiveX插件,主要用于了调用WindowsAPI,调用本地EXE等。
这种模式,在2013年-2014年,逐步被CS+BS的模式所替代。

Applet插件,主要用于了多线程下载控制,调用JS等。总体来说,JVM对Applet的沙盒控制还是越来越严格了。
在2013年引入了Java Web Star,但效果也一般。

BS架构的演化

==========================================================
2010年下半年,公司开始BS开发,主要语言为java。以Sevlet+JSP为主,只用了Struts1框架。

2011年,引入三大框架Struts2、Hibernate、Spring。

2012年-2013年,以后台通信业务为主,主要使用了Hibernate、Spring。负载均衡采用了APACHE+TOMCAT的方式。

2013年-2014年,引入了Maven及模块式开发,引入了ESB,开始推行单元测试。Struts2逐步切换到SpringMVC,Hibernate逐步切换到MyBatis,并进行了二次封装。

2015年,引入监控机制,版本发布机制,开始抽离SQL语句。引入Reids+Nginx,引入MongoDB,引入消息中间件。

2016年,引入CI,引入eXistDB。

==========================================================
自从2010年开始使用C#以来,也有不少BS项目是C#开发的。

2010年-2014年,主要采用ASPX+ADO.net的开发模式。

2015年,引入了EntityFramwork+MVC的开发模式

2016年,引入单元测试及CI。

CS架构的演化

最开始,公司的CS开发语言,主要有三类:BCB、VC、C#。SVN及自动更新功能已经完善。

2009年,我们组采用的开发工具为VS2008,UI框架为MFC,没有任何框架,为纯Native的C++开发,通过ODBC直连数据库。

2010年,开发工具切换到VS2010,UI框架直接切换到了WPF,程序功能开始进行切分,将后台功能从前端UI分离,封装为Windows服务,但仍然为纯Native的C++开发,仍然通过ODBC直连数据库。

2011年~2014年,个人转战BS,公司CS期间架构相对稳定。

2015年,开始组件式开发,转型很痛苦。

2015年,开始混用CS及BS,将两层CS架构,转换为CBS架构。

2016年,引入应用中间层,将两层CS架构,转换为三层CS架构,开始面向接口编程。

HBase基本操作04

最后,我们说一些不那么常用的操作吧:

新增列族:

hbase(main):036:0> alter 'patientvisit', NAME=>'cftest'
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 3.5200 seconds

修改列族:

hbase(main):039:0> alter 'patientvisit', NAME=>'cftest', VERSIONS=>3
Updating all regions with the new schema...
0/1 regions updated.
1/1 regions updated.
Done.
0 row(s) in 3.0070 seconds

删除列族:

hbase(main):040:0> alter 'patientvisit', NAME=>'cftest', METHOD=>'delete'
Updating all regions with the new schema...
1/1 regions updated.
Done.
0 row(s) in 2.4890 seconds

Continue reading HBase基本操作04