万安逍遥子的博客

Share More · Understand More · Enrich Oneself


  • 首页

  • 关于

  • 标签

  • 分类

  • 归档

管理初创团队心得01

发表于 2019-04-25 | 分类于 管理 |

管理心得_怎么管理初创团队

​ 我目前所处的公司,就是二线城市的一个小公司,团队都是新人,我自己也是新人进来这个公司。那么就会存在搭建团队的问题,自己也是在试用期就开始组建人手,既要配合领导,又要协调公司资源,同时要调配好团队的问题。初创公司往往就容易出现团队不稳定的情况,这个是每个公司创立初期都会容易出现的(一般来说初创公司容易出现2个事:业务不稳定、团队不稳定)。

​ 截止到目前为止,公司发展不是很稳定,这2个共性问题都存在,所以导致目前发展比较艰难,投资人出现信心问题,当然不可避免有一部分是大环境的客观原因,但是现在反思一下管理团队也会出现很多问题。

1、势如破竹,重拳出击

​ 在创业初期,领导层一定要有创业的精神,除了吃苦耐劳,产品新颖这些之外的管理意识我觉得也非常重要。以前我在国企上班的时候,我们如果要做一个产品研发,我们一般是领导层想做,分配给中层干部去考虑一下这个事情,想想怎么去落地完成,然后开始大会小会讨论怎么做的问题,各种调研、论证啊等等搞了半年,然后开始3个月做完,后续也没有话题了。但是初创公司不一样,如果目标不坚定,很难带动公司的发展,很难激发团队的热情,连自己要做什么都不知道,团队更加不知道。

​ 往往也是这样,如果初创公司的领导不知道公司做什么,那么真的就是浪费资金在创业。同时,如果知道要做什么,按照国企的思路去做,那也不适合互联网发展,要的就是快速决断,要的就是迅速验证,要的就是快速总结。所以,创业的企业家一般都是杀伐果断的那种,一般都是有固执一面的那种,一般都是不碰南墙不回头的那种,一般都是不服输的那种,一般都是说干就干的那种。

2、完整的办事流程

​ 一个公司最头疼的就是流程问题,按道理按章法,初创团队就是要野蛮生成,但是野蛮生成那是在个别地方可以有不一样的处理方式,领导一句话拍板了。因为人数少,部门少,所以建立的流程路径要短,但是缺少了流程那就会乱糟糟的。原先在看管理的书籍的时候,也有大佬讲过,管理超过10个人的时候就要想办法分管理层了,因为你的精力有限。一旦有多层级的管理,一定是建立规章制度的,没有这个,大家都是会分神的。这里说的完整的办事流程,不是说要跟大公司一样,需要各种条条框框的业务流程,完整说明的是要有回路,要能闭合,一个报销要到哪里结束,一个项目从哪里发起到哪里结束等等。

​ 为什么说这个呢,感觉也是比较low的一个事情,是因为一年左右的时间了,团队在公司的规章制度上还是不懂,不知道怎么去做事情,有的时候也会因为这个发生争吵的问题,甚至现在有种苦笑不得的迹象。有的时候因为项目的原因,需要大家加班处理,然而发现大家都觉得如果不是非必须,还是明天来做或者回家做,因为不知道怎么报销车费,感觉好麻烦的样子。所以我觉得这个制度一定要逐步深入团队心中去,让大家上班有一根弦在绷紧。

3、事无巨细

​ 在创业初期,很多时候都是一个人当多个人使用,一会是后台,一会是前端,一会又是测试了,这种情况比较普遍,但是有的时候坐在管理层的时候就会发现,有的时候是技术,有的时候是业务了,有的时候还是售前。真心也是比较头大的一个事情,因为一个人毕竟精力和经历都有限,不可能在每个领域都做的那么完美,甚至说是熟悉吧。所以前期做了比较多的杂事,就是一个救火队员,哪里有火哪里扑。有过这么一段时间,我是一直跟在总经理后面不管的谈项目经验, 介绍业务,编写解决方案,一天天的忙的跟狗一样,技术团队这边又没有时间去管理项目和技术指导。导致出现团队项目做到哪一步都不清楚,版本出现了重大异常也不太清楚,更别说代码哪里出现问题了。

​ 其实想想也是自己经验不足,以及加上自己的焦虑问题,让自己在处理问题的时候有种前怕狼后怕虎的感觉。一是感觉谈业务浪费时间,会让自己没有时间来学习技术了;二是感觉不做点自己职责之内的事情,自己有点莫名的心慌。其实事后想想,这是自己在管理上的问题,没有注意细节,所以没有收获。在谈业务的时候应该要掌控好谈判业务的水平和能力,要在谈判中学到对方想要的需求以及怎么给对方带来一定的价值。同时不能脱离自己岗位的职责范围,不能给自己找借口说明什么,而是要多去寻回各个过程的里程碑节点,一定要掌握进度、掌握当前计划、掌握当前的问题。事无巨细,但不必事事躬亲,leader要做的就是带领大家朝着共同的目标前进,解决团队中的问题。

​ 在初创公司这段时间的磨练当中,经历了公司产品原型打造,业务调研,也参与公司战略发展规划转移。亲身感受到创业发展的艰辛,以及初创型公司的不稳定,联合创始过程的复杂心里路程。曾一度思考路在何方,职业发展规划在哪里,这辈子该如何进行下去,很担心自己未来是失业,会转行,会委屈自己做不感兴趣的东西。痛定思痛,我觉得这是自己没有能力的表现,如果自己学富五车,博学多识,何曾会没有伯乐来欣赏,就怕有大量的伯乐,千里马而不常有。

欢迎加我微信(xjp8905)一起聊技术,一起聊赚钱,一起聊管理!备注(博客)

微信

怎么给别人提意见

发表于 2019-04-16 | 分类于 管理 |

管理心得_怎么给别人提意见

最近在学习极客时间朱赟的技术管理课,在提升自己的同时,也在反思之前犯过的一些错误,有些东西我看上去确实是那么一回事,但是自己却还没有如此的总结过一些问题,以及具体的解决方案,还是更多的停留在码代码的层次。所以通过反思以及总结笔记的方式分享。

问题

听完报告,或者跟别人交流的过程中就会有发表观点或者评论的地方,如果没有意见或者没有很好的意见总是会难以记住你,亦或是本身是有问题,但是你提意见的方式不对会让别人讨厌你。一般来说如果不注意方法提意见就会让别人内心有:

  1. 我自己知道这个方面有待于加强,你也不用老说;
  2. 为什么要在公众场合提意见,让我下不来台;
  3. 就凭你,你连XXX都不会,凭什么对我指手画脚;
  4. 有你说这么严重吗?
  5. 我什么这个样子咯,我怎么不觉得。

大家提意见都是一个好意,没有必要诋毁人家,但是也不否认这个浮躁的社会有部分杠精。

解决方案

朱赟在音频也是说到,主要的解决方案是你如果要说别人不好,要记得要多说点别人的好,先说点别人的好,别人更加容易接受。虽然我知道我不行,但是你要先夸下我,让我有点面子之后我好下台。中国人讲究的还是面子问题,至于自己是不是这样,其实他自己心里肯定有一杆秤。

  1. 地点很重要,尽量找个安静的地方,避开他人提意见;
  2. 可能的话,稍微用几句闲聊的话来导入整体;
  3. 提意见的语气要注意,避免责备,而是客观的描述问题;
  4. 避免太多的个人情绪、观点和感觉,避免一些伤人的话语;

对于大部分人来说还是更愿意听一些夸奖、赞美的话,所谓忠言逆耳这是有道理的。

反思学不到东西的梗

发表于 2019-03-26 | 分类于 管理 |

管理心得_员工感叹学不到东西

在我们这种初创型的公司中,经常会有员工觉得学不到东西,或者是国企以及大型企业当中,在上班一段时间之后就会有人抱怨学不到东西,待着没有意思。我最近感觉大家情绪比较低落,主动性较差,我做了一个问卷调查,收听一下大家的声音。然后我就收到了不少于一个骨干高级工程师对公司目前团队的反应是来公司学不到东西,感觉没有意思,什么事情都要自己去摸索。

​ 刚开始我觉得讲的蛮有道理的,我们现在一个18年创立的公司,确实没什么东西可以学习的,而且我作为技术负责人不一定能教你多少东西,可能点拨一下你就懂了。后来我觉得不对劲,我觉得我怎么没有觉得学不到东西,而且我觉得一直是时间不够我学习的。所以我就抽了点时间认真思考了一下这个问题,怎么去回答这个问题。

​ 对于初创团队来说,我突然觉得这个问题也比较搞笑,一个初创公司能有什么让你学习的,一张白纸等待的是不断的输入描绘,一个初创公司的核心骨干又有谁能教你东西的。所以我觉得遇到感叹学不到东西的小伙伴,应该思考几个问题:

有没有用心

1、有没有用心在事情,对待每一件任务有没有用心在思考怎么去做,为什么要这么做;

2、有没有用心在为公司着想,公司的发展离不开每个人的努力,每个人的汗水和成果都能在公司得到体现,甚至公司的存亡都会与大家息息相关;

3、有没有用心为自己着想,每个人的兴趣爱好不一样,每个人的发展规划不一样,每个人想要的东西不一样,有没有为自己想一想自己要学的东西是什么。

大家只要有很好的职业规划,多对自己负责一些,认真思考自己当下的事情是否做好了,那么做好自己的学习计划,就可以很好的规划每天要学习的东西,也就不会没什么东西可以学。

学东西不是靠喂

学东西如果靠喂那么真的就很难长大,很难学习到真正的东西,“纸上得来终觉浅,绝知此事要躬行”,只有不断探索,甚至冒险才能有新的收获。在公司的发展过程中,我也会经常提出一些新的idea让大家有兴趣的去尝试,去挑战和大公司一样的技术开发能力,我从来不会喂某个人技术,哪怕是一张白纸的实习生。

击败自己

工程师在学习初期会有不断的收获感,学习的任何东西都是新东西,但是达到一定层次之后,工作中就会有不少是重复的东西,就会觉得学不到什么东西。生活当中、学习当中、工作当中,最大的敌人慢慢的就会变成自己,只有战胜自己的缺点,不断的提升自己的优良品质,才是真正的收获。一个初创公司,本身就不是为了学东西来的,而是要有初创精神在探索当中教学相长。

springboot-base

发表于 2019-03-23 | 分类于 java后台 |

Springboot 基础教育

最近看见恒宇少年出了新的技术框架,想起之前我还学习过他的Springboot的教程,原先有些心得感受重新编写一遍。

一、FastJson的使用

FastJson是阿里出的json处理库,在java开发与前端调试的接口基本上是使用json的方式,所以如果有个工具能够帮助解决json字符串转换的话是有非常迫切的需求,尤其是json转化为实体对象以及数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
public static final Object parse(String text);// 把JSON文本parse 为JSONObject或者JSONArray

public static final JSONObject parseObject(String text);// 把JSON文本parse成JSONObject

public static final <T> T parseObject(String text,Class<T> clazz);// 把JSON 文本parse为JavaBean

public static final JSONArray parseArray(String text); // 把JSON文本parse成JSONArray

public static final <T> List<T> parseArray(String text, Class<T> clazz); // 把JSON文本parse为JavaBean集合

public static final String toJSONString(Object object); // 把JavaBean序列化为JSON文本

public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean序列化为带格式的JSON文本

fastjson 还有比较常用的就是对实体类的注解了 @JSONField

1
2
3
4
5
@JSONField(name="Date",format="dd/MM/yyyy",ordinal=3)
private Date dateOfBirth;
// format 用于格式化
// ordinal 用于指定字段顺序
// serialize 一般是数字指定字段序列化

二、拦截器的使用

1、创建一个拦截器,让他集成HandlerIntercepter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class SessionInterceptor implements HandlerInterceptor
{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
System.out.println(request.getRequestURI());
//登录不做拦截
if(request.getRequestURI().equals("/user/login") || request.getRequestURI().equals("/user/login_view")){
return true;
}
//验证session是否存在
Object obj = request.getSession().getAttribute("_session_user");
if(obj == null){
response.sendRedirect("/user/login_view");
return false;
}
return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

2、把拦截器配置到Springboot的配置当中

1
2
3
4
5
6
7
@Configuration
public class SessionConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new SessionInterceptor()).addPathPatterns("/**");
}
}

3、尝试使用日志的例子来做拦截器,日志管理有默认的一些框架,如Springboot默认是Logback,但是有的时候我更希望能有界面进行日志查询,那么我就会做一个实力类来做这块的记录,然后拦截器做好日志拦截

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
@Entity
@Table(name = "t_logger_infos")
@Data
public class LoggerEntity implements Serializable
{
//编号
@Id
@GeneratedValue
@Column(name = "ali_id")
private Long id;
//客户端请求ip
@Column(name = "ali_client_ip")
private String clientIp;
//客户端请求路径
@Column(name = "ali_uri")
private String uri;
//终端请求方式,普通请求,ajax请求
@Column(name = "ali_type")
private String type;
//请求方式method,post,get等
@Column(name = "ali_method")
private String method;
//请求参数内容,json
@Column(name = "ali_param_data")
private String paramData;
//请求接口唯一session标识
@Column(name = "ali_session_id")
private String sessionId;
//请求时间
@Column(name = "ali_time",insertable = false)
private Timestamp time;
//接口返回时间
@Column(name = "ali_returm_time")
private String returnTime;
//接口返回数据json
@Column(name = "ali_return_data")
private String returnData;
//请求时httpStatusCode代码,如:200,400,404等
@Column(name = "ali_http_status_code")
private String httpStatusCode;
//请求耗时秒单位
@Column(name = "ali_time_consuming")
private int timeConsuming;

JPA 就不说了,这里重点说明一下拦截器,仿拦截器的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
// 写一个获取Spring上下文管理的Bean工具


public class LoggerInterceptor implements HandlerInterceptor
{
//请求开始时间标识
private static final String LOGGER_SEND_TIME = "_send_time";
//请求日志实体标识
private static final String LOGGER_ENTITY = "_logger_entity";

/**
* 进入SpringMVC的Controller之前开始记录日志实体
* @param request 请求对象
* @param response 响应对象
* @param o
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
//创建日志实体
LoggerEntity logger = new LoggerEntity();
//获取请求sessionId
String sessionId = request.getRequestedSessionId();
//请求路径
String url = request.getRequestURI();
//获取请求参数信息
String paramData = JSON.toJSONString(request.getParameterMap(),
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue);
//设置客户端ip
logger.setClientIp(LoggerUtils.getCliectIp(request));
//设置请求方法
logger.setMethod(request.getMethod());
//设置请求类型(json|普通请求)
logger.setType(LoggerUtils.getRequestType(request));
//设置请求参数内容json字符串
logger.setParamData(paramData);
//设置请求地址
logger.setUri(url);
//设置sessionId
logger.setSessionId(sessionId);
//设置请求开始时间
request.setAttribute(LOGGER_SEND_TIME,System.currentTimeMillis());
//设置请求实体到request内,方面afterCompletion方法调用
request.setAttribute(LOGGER_ENTITY,logger);
return true;
}

@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object o, Exception e) throws Exception {
//获取请求错误码
int status = response.getStatus();
//当前时间
long currentTime = System.currentTimeMillis();
//请求开始时间
long time = Long.valueOf(request.getAttribute(LOGGER_SEND_TIME).toString());
//获取本次请求日志实体
LoggerEntity loggerEntity = (LoggerEntity) request.getAttribute(LOGGER_ENTITY);
//设置请求时间差
loggerEntity.setTimeConsuming(Integer.valueOf((currentTime - time)+""));
//设置返回时间
loggerEntity.setReturnTime(currentTime + "");
//设置返回错误码
loggerEntity.setHttpStatusCode(status+"");
//设置返回值
loggerEntity.setReturnData(JSON.toJSONString(request.getAttribute(LoggerUtils.LOGGER_RETURN),
SerializerFeature.DisableCircularReferenceDetect,
SerializerFeature.WriteMapNullValue));
//执行将日志写入数据库
LoggerJPA loggerDAO = getDAO(LoggerJPA.class,request);
loggerDAO.save(loggerEntity);
}

private <T> T getDao(Class<T> clazz,HttpServletRequest request){
BeanFactory factory = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
return factory.getBean(clazz);
}

mpvue 配置页面

发表于 2019-03-15 | 分类于 前端 , 小程序 |

今天学习蜗牛老实的MPVUE视频教程,因为版本不一样,我的mpvue-loader 的版本是2.0.0(蜗牛老师的是1.0.13),,尴尬现在才学习。其中第三章节中需要在todolist 页面中现实todolist的标题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 蜗牛老师 在todolist 的main.js中 修改默认配置

import Vue from 'vue'
import App from './index'

const app = new Vue(App)
app.$mount()

// fixme
export default {
config: {
'navigationBarTitleText': 'todolist'
}
}

然后并不生效,所以我觉得应该是版本问题了,果然在网上查了资料看了下v1.1.1以下是可以这么写的,也就是说蜗牛老师的版本在这之下是没有问题的。v1.1.1之后的版本需要变更,需要在todolist的目录下面新增一个main.json文件,不然npm run dev 之后也会生成main.json,只不过自己不定义main.json 就是空的。所以正确写法是:

1
2
3
4
5
6
7
8
// 正确写法 todolist目录下新增main.json

{
"backgroundTextStyle": "light",
"navigationBarTitleText": "todolist",
"navigationBarBackgroundColor": "#fff",
"navigationBarTextStyle": "black"
}

由此可见,如果要修改每页的导航栏信息可以新增main.json

Jammy · xiao

本站万安逍遥子(Jammy) 的学习笔记分享,是一名二三线城市小软件公司负责人的学习过程,通过搭建博客的方式鞭策自我,也希望能有大佬指导、交流。

5 日志
4 分类
5 标签
E-Mail
© 2019 Jammy · xiao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4