最近和一些前辈聊了一些东西,让我意识到了自己的一些问题,虽然自己之前也有一些类似的疑惑和思考,但是并没有人明确指出问题。最近的几次谈话让我不得不仔细思考这些问题,边写边思考,看看能走到哪一步。
耗子叔的分享
前一阵子耗子叔来我司分享,说到了他的一个观点: 人对一个事情的兴趣是会随着不断重复这件事而消耗的,一件好玩的事,你的兴趣再浓厚,每天重复,总有一天会觉得无聊,假如这件事正好是你的工作,那一旦失去兴趣,你的日子就会变得非常难过。他举了个例子,假设一个程序员他一辈子想写的代码就100w行,超过这个数他就厌倦了,写一行少一行,那么他应该让他的每一行代码发挥在价值最大的地方。他又举了个例子,说他帮别人外包解决系统性能问题,外包架构设计,报酬丰厚。
我觉得这里最重要的点就是”价值最大的地方”,如何衡量价值最大?在A公司薪资1w,在B公司薪资2w,B公司就是价值大的地方吗?这是在鼓励程序员跳槽吗?我觉得不全对,这样理解是片面的。
和前同事的交流
之前和以为同事在他离职前聊了一下,关于个人发展的一些话题。大概涉及到了,对自己能力的评估,比如算法,数据结构,想做什么样的事,竞争力如何等等。我对自己的评价是这样的,智力只能算中等水平,因为数学不是我的强项; 逻辑能力,理解能力还不错,高中,大学物理特别好,就是因为物理并不需要特别强的数学能力,理解公式的含义就能解题; 英文能力不错,阅读和口语都不错,特别是技术相关的话题,学校里的基础就不错,这些年看文档和技术文章得到不少锻炼,自认为在程序员中英文能力算是不错的。算法和数据结构不是我的强项,能力范围是根据现有理论能实现算法,可能无法创造出一个算法,或者说反应比较慢,通常要想的比较久。操作系统,计算机原理呢,这些都是自学的,了解一些内容,难免有半吊子的嫌疑。
这是自身的现有条件,这样的一个我,适合去深入一方面呢?或者说在哪个领域和别人竞争呢?
问题
其实过去也有想过一个问题,自己看的东西很多,但是深入到非常底层的点却几乎没有。要说非常深入的话,要算Laravel这个框架,源码几乎都读过。因为工作用用到了,所以想学透它。但是最近半年都没用了,所以对新的代码不熟悉。
这种现状的原因是什么呢?
程序员需要什么能力
Coding
Linus 采访说一个成功的项目是99%的努力+1%的创新,他之前甚至说过所谓的技术创新都是扯淡。大部分程序员都是为了实现业务服务的,这部分程序员比拼的是抽象业务的能力,对业务模型抽象的好,设计出来的系统简单易懂,开发也快速,比如,同一个业务,一个程序员设计了2张表就完成了功能,并且考虑了一定的扩展性,而另一个程序员设计了5张表,没有扩展性,这就是差别。据我观察,抽象能力好的程序员不是很多。
做业务的程序员如果能对常用工具的原理有一些探究,例如看看框架的实现,看看数据库的源码,能修修改改一些东西,那就更加有竞争力了。这样的人比较少了,基本都是是对计算机有浓厚兴趣,好奇心的人,在业余时间会去钻研的人。我也面试过一些大厂出来的程序员,很少有能到达这个水平的,也可能是我面的人都比较水。
这里漏说了一个程序员的基本技能,就是写代码。写代码分为三个层级:
- 代码可读。表现为,变量命名,函数命名,数据结构命名,语义是否明确;代码注释是否可读。这是最基本的要求,所以英语对程序员非常重要。做到需要少量思考。
- 代码可重用。表现为,是否有重复的控制(control)出现,逻辑相类似的代码是否提炼出来公用的方法。是否运用设计模式。做到需要稍微多一些的思考,主要还是抽象能力。
- 代码可测试。表现为,单元测试的覆盖率。这个指标非常明确,覆盖率越高越好。可测试代表了你对数据结构的依赖做了比较好的规划,一般会用到面向接口编程。这个需要不少思考,还有工程的能力。
以上这些我认为我都做到了。
这些能力就够了吗?No.
Others
做到以上这些,只是个好的coder,不用愁找不到工作。但是实际的职场并没有那么简单。
最常用的一个能力就是沟通能力。最近也在反思这些问题,例如,我最头痛的问题就是,和一个人解释问题,但是他怎么也不明白,通常这种情况,我只有耐心说一遍,不得不说第二遍时候我的语气会有变化,我自己也能发现。这样的效果不好,一旦让别人产生敌对情绪,那么你的方案再好,人家也会一意孤行,最终是系统设计烂,整个项目受到牵连。你说沟通能力重不重要。
我很讨厌不断重复一件事情,有时候不得不到领导那里仲裁的时候,我描述问题会简略一些,就是因为性格中的那一点问题作怪,导致我的立场没有表达清楚。这点要改。
如何让别人听你的?这个问题我也回答不好。增强自身的影响力是个办法,如何加强影响力呢?本职工作优秀,乐于帮助别人解决问题,我觉得我能做到这两点,其他的方法还要探索。
证明自己,影响别人,找到价值,这是我未来3年的大目标。