在很多人的职场经历中应该都有过这样的思考——到底应该去大公司还是小公司?
之前我也思考过这个问题,最后的选择,是去了小公司。就我个人的观察和思考而言,我认为这个问题本身就是有问题的,因为大多数人认知里的公司大小,指的是其规模,但是就我所在的软件行业来说,有些“小公司”也掌握着“头部资源”,比如尖端技术、核心算法、大量优质客户等等,所以这个问题如果换成“到底应该去创业型公司还是成熟型公司?”更加合适,针对这个问题,每个人又会有自己的取舍,这里不做过多的讨论,我只想说说我在一家创业型公司的任职经历,供大家参考。
2016年3月初,经老师推荐,我进入了一家创业型软件公司,任项目经理职务,这家公司主要是做软件定制开发的,就是传统意义上的软件外包公司,不过好的一点是只做项目外包,不做人力外包,而且项目也多以业务系统为主,较少涉及到网站、微网站之类的项目。2020年3月底,我正式从这家公司离职,在这家公司正好工作了4年1个月,这4年里,总体感受就是越来越忙,负责的事情也越来越多,渐渐地公司很多同事都习惯于有什么不清楚的都来问我,可以说这四年给了我很多经历,现在说说我在这家公司所获得的成长,以及我认为不足的地方。
首先是技术方面:
1、在进入这家公司之前,我主要是以PHP技术栈为主,除了PHP之外,也在项目中用过一些C#和Android开发技术;
2、进入这家公司后,因为公司的技术总监是做了十多年Java的老程序员,且其搭建了一套非常方便的开发平台,所以开始慢慢转型做了Java开发,主要是SSM( Spring、Spring MVC、MyBatis )框架,由于之前系统的学过Java SE技术,所以转型过程还算顺利,复习了一些Java Web的基础,然后再找了一些视频学习 了一下,再结合公司的框架和其他人的项目代码,很快就能够进行项目开发了;
3、刚进入公司的时候,我搭建了基于SVN的代码版本管理体系,后来随着项目增多,加上部分项目开始了二期、三期建设,所以对版本和分支的管理有了一定的需求,公司将代码版本管理体系换成了git,就我个人的使用体验来说,在分支管理、多版本同步开发等方面,我认为git确实要比svn方便一点;
4、数据库方面,由于之前做的项目数据量总体较小,以前虽然去看过一些数据库优化的资料,但一直没有实际验证的机会,在这家公司的一个项目中,由于是医疗电商项目,其中有一个单表的数据量急速增加,导致查询变慢,经过SQL分析之后,发现是使用了文件排序引起的,后来根据相关资料,对数据库进行优化,主要是两个方面,一是加索引,二是优化数据库配置,结合这次机会,也系统的学习了一些MySQL的优化技巧,包括数据库设计、SQL语句以及数据库服务配置等方面;
5、服务器方面,公司绝大部分的项目都是部署在Linux服务器上,而这其中大部分服务器的环境部署都是由我来做的,所以积累了一些服务器部署的经验,主要是Nginx、Tomcat、MySQL、PHP等服务的部署、配置、调优等操作,后来随着Docker技术的成熟,技术总监引入了Docker部署,并将git和Docker结合起来,在公司自己的开发服务器和测试服务器上,通过特定的git日志,触发hooks,可以自动创建Docker镜像并部署启动,刚开始只是使用,后来也去学习了一些Docker的操作,包括镜像生成、镜像部署、日志查看、路径映射等等,不过目前只在Linux环境下玩过,在Windows环境下,一直没有成功;
6、从2019年开始,公司技术体系开始由较为单一的SSM框架开始向Spring Boot+Spring Cloud微服务架构转型,在这个过程中,我也去学习了一些微服务架构的知识,但是由于工作越来越忙,所以只有一次参与了具体代码的编写,目前对于微服务架构的了解,主要还是集中在概念和框架层面,真要是动手去写的话,还需要一个熟悉的过程,根据我的经验,我认为不是所有的项目都适合微服务架构,类似于之前做的一些针对特定行业、特定用户使用的非平台类项目,我认为SSM框架足以应对,且成本更低,但如果是平台型项目,如多商户电商平台、集团业务系统等这类项目,更适合微服务架构。
技术方面总体来说,在这家公司的四年时间里,技术上的成长还是巨大的,但是由于工作重心、个人技术路线、和项目规模等原因限制,我在Java技术体系下的技术深度还有很大的欠缺,在最近找工作的过程中,我也发现了:第一,如果抛开项目经验不谈,我目前的Java技术水平仅仅能胜任开发工作,还不能够胜任架构工作;第二, 行业领域深度不够,虽然做了一些工业制造、医疗、政府、教育等行业的项目,但是深度还比较欠缺,因为之前在其他项目中遇到过一些大公司的行业专家,与他们相比,还有很大的进步空间;第三,对一些新兴技术的掌握非常欠缺,比如大数据技术栈、DevOps技术体系等。
其次是项目管理方面:
1、进入这家公司之后,一直担任的都是项目经理的职位,最开始完全是按照以前做项目的经验进行管理,因为项目规模小、团队人数少,所以也并没有觉得有什么,最开始的时候,我的主要精力还是放在了代码上;
2、随着项目规模的不断增加,我开始跟着技术总监学习一些项目管理和团队管理的知识,这期间通过技术总监了解了一些PMP和敏捷项目的知识,后来自己也买书或者从网上看过一些资料,逐步开始规范了项目管理的工作,并在部分项目中尝试使用敏捷项目管理的一些手段,虽然用的恨不规范,但是确实对项目管理有一定的帮助;
3、由于公司人少,所以往往一个项目,我需要从售前就参与进去,直至项目交付,有些项目的后期技术运维也是由我承担,这个过程真的很锻炼人,我想如果在一个组织机构健全的大公司,应该很难有这样的机会去经历多个项目,在这期间,也踩过很多的坑,不过好在是这些经历最后都成为了经验;
4、在工作的过程中,因为公司提出需要将几个有代表性的项目孵化成公司的产品,我也去学习了一些产品相关的知识,看完了《人人都是产品经理》这本书,也从中了解到了“Y模型”等专业的产品知识,虽然直至我离职,公司的产品也没有孵化出来,但是这些产品相关的知识却被我用在了项目需求采集、分析的工作中,着实提升了我对需求的理解,最明显的效果就是现在无论是多复杂的业务,我都能以很快的速度理解客户的意图,并能够顺利的将技术和客户的沟通连接起来,避免鸡同鸭讲的情况出现;
5、在这家公司,我经历了两次团队轮换,第一次是因为公司刚起步,招的大多都是实习生,而且很多都是我以前在学校实验室带的实习生,这批实习生的水平比起普通应届本科生应该高出了至少1个level,所以毕业时,因为工资和公司规模的问题,大部分人都离职了,第二次团队轮换是因为18年底的几个项目做得大家都很累,所以大部分人在过年前,向公司提出了辞职,在这个过程中,我也和公司一起完整的经历了三次团队组建、培养、换人、解散,经历了两次团队轮换后,我思考了很多,也自己学习了一些团队管理的知识,后来也和公司一起建立了对技术团队的考核制度,直至今天,我仍然认为技术团队应该保持总体和个体的较高水平,主要是在技术能力、理解能力、沟通能力等方面体现,虽然不必每个人都有架构师的水平,但至少应该保证每个人都不能是搬砖块的水平,尤其是对于具有复杂逻辑业务系统开发团队;
6、之前做简历时,梳理了我在这家公司的项目情况,4年时间里,我在这家公司总共负责和参与了9个项目的实施,同时,还参与了其他一些项目的前期调研、方案编制、标书编制等工作,现在回头去看,这份经历还是非常丰富的,这些经历也都给我带了很大的成长。
项目管理方面总体来说,在项目管理方面,这家公司给了我一个成长空间,无论是技术管理、需求管理、时间管理还是 团队管理等方面,让我从完全靠经验进行项目管理的初级项目经理,慢慢成长为现在有一定的规范和套路可循的项目经理,项目管理是一个很复杂的东西, PMBOK将项目管理划分为十大知识领域,足以说明项目管理的复杂性,目前我还在这条路上继续摸索前进,将来也会继续深入探索。
说完了在这家公司的成长,现在来说说我离职的主要原因吧,也为其他正在创业型公司奋斗的小伙伴提供一个参考。
其实我相当于这家公司的第一个员工,我进入公司时,公司只有我一个正式员工,之前有一个同事,但也是过来兼职一下的那种,后来就再没有出现过了。这家公司在前两年的发展速度很快,超出了我的预期,加之公司规模较小,所以虽然工资待遇较低,但是大家工作都比较开心,公司还经常组织聚餐、游戏等活动,而且还有很多时间用来学习和分享(经常组织内部讲座),这个阶段我觉得我和公司在同步成长;但随着公司的发展,人员开始增多,项目压力也变得越来越大, 而且因为工作越来越忙、项目组间的时间不同步、一个人同时参与多个项目、经常加班等原因, 后来这些隐性福利慢慢就没有了,而我个人在每天的工作中已经消耗了极大的精力,业余时间大多都用来休息了,自己的进步也越来越慢了,当然这里也有我个人的原因,但是总的来说最后这一年多的时间,不论是我个人,还是公司的业务发展,都遇到了一些瓶颈,让我感觉到了极大的不安,软件行业或者互联网行业本来就是一个高速发展的行业,如果不能够进步,相对于整个行业来说就是退步,再加上其他一些因素的影响,最终选择了在今年3月底正式离职。
写到这里,其实本文的正式内容已经写完了,不过结合这几年的经历,我还是想再总结一下我认为什么样的软件行业小公司是值得去的:
1、有较强的核心技术,这个技术不一定是尖端技术,但是一定不能是落后的技术,比如我之前任职的这家公司,就有自己的开发平台,前后端都进行了封装,开发人员在开发平台上进行配置后,所有的后端基础增删改查代码及前端常用组件就已生成,开发人员绝大部分情况只需要专心关注业务流程和逻辑的实现,这也是公司前两年能够快速发展的前提;
2、有明确且合理的业务方向,有明确的业务方向很好界定,比如专注于某个领域或某几个相关领域,至于是否合理,就需要自己考量了,这里可以结合行业趋势、国家政策、个人经验等;
3、有优秀的技术团队,软件行业其实是知识密集型和劳动密集型行业,一家公司的成败,很大程度上取决于团队的水平,如果想做大做强,那么一个优秀的技术团队是前提条件,这里的优秀不仅仅指技术水平,还包括理解能力、沟通能力以及解决问题的能力,如果一个技术人员连需求都理解不了,或者需求理解了也不知道怎么做,那他也许真的不适合这个行业,但如果一个团队中有很多这样的人,那这个团队的水平也就可想而知了;
4、有健康的资金链或者说有稳定的收入,如果是乙方公司(做外包或实施居多的),那么就需要稳定且持续的项目,如果是甲方公司(做产品居多的),那么就需要稳定的用户群,不论一家公司是否拿到了风投,如果其没有一个健康的资金链,那么倒闭只是早晚的事;
5、有一个沟通没有障碍的直接领导,因为在正常情况下,你的直接领导是你最重要的合作伙伴之一,如果你和直接领导都无法保持顺畅高效的沟通,那相信我,你的工作每一步都会走的很艰难,这里的沟通不仅仅指他听懂了你的话,还指你能明白他的话,虽然现在很多公司都在推行敏捷管理或者自管理模式,但是大多数情况下,你的任务还是来自于你的领导,如果你连领导说什么都不懂,那你怎么保证自己做的是正确的事;
6、有完善合理的薪酬体系,之前在网上看到过,说什么好的公司薪酬体系都很简单,但是我想如果真是一家发展良好地公司,其薪酬体系也不可能真的非常简单,所以应该是有完善合理的薪酬体系是最好的,如果某一家公司的薪酬体系你完全搞不懂是怎么算的,那也不建议你去,如果某家公司除了基本薪资其他什么都没有的,也不建议你去(除非他能保证永不加班,但在这个行业是不可能的),良好的薪酬体系应该是由底薪、绩效、奖金、补助、年假、调换休、五险一金(这个特别重要,如果连这都保证不了,那其他的你就更难奢求他保证了)等等组成,且规则清晰易懂并面向结果导向,即你为公司产生的利润越多,你能拿到的就越多;再来说合理,合理的薪酬就是需要和市场挂钩,明显高很多或者低很多都有问题,如果高很多,那就要考虑可持续性问题或者是否需要疯狂加班的问题,明显低很多的话,就要考虑现实问题以及未来能否兑现画过的那些“饼”了;
如果同时能够满足以上几点,那么即使这个公司再小,相信也会很快发展壮大的,无论是业务壮大还是业务及团队规模一起壮大,应该都只是时间问题了。
最后,还是要感谢一下这家让我成长了这么多的公司,这四年时间为我提供了大量的机会,让我在技术、管理等方面都有了长足的进步,正如我在辞职信中所写的,我仍坚信公司的发展方向没有问题,也希望公司能够取得更好的成绩,希望将来的某一天,我能够以曾今是公司的一员而感到骄傲,再次感谢。