不知不觉工做已三年半,准确的说是三年零五个月。在这过程当中,在技术和业务上的成长,多多少少都会有一些,但最大的收获,仍是长见识。聊聊几点感觉吧。java
别只顾埋头作事,要作“对”的事情。程序员
这是我的情社会,你的领导也只是普通人,他不太会有大把的精力去关注底下的人天天具体干些什么事情,这种状况下,若是你只知道一味地埋头作事,即使作了不少,加班累成狗,可是领导压根不知道,是没有任何意义的,典型的吃力不讨好。不少时候是须要你主动向上汇报的!按期地跟领导保持正向沟通,积极反馈工做中遇到的问题以及本身的想法,让领导感知到你的付出,固然有产出是最好的了。面试
什么是“对”的事情?要有全局观,审时度势。当前领导最关心最迫切的事情,就是对的事情。举个栗子,随着用户量的快速增加,系统的压力愈来愈大,原有最初的系统逐渐暴露问题,甚至所以频繁出现线上故障。这个时候,若是领导发起了“系统压测”的任务,那么当务之急,压测就是最重要的事情,工做的重心应该以此为准。即使此时业务上也有不少新的需求,你也应该作取舍,不然即使你作了一大堆需求,此时的领导根本无暇顾及,他所关注的必然是压测的进度,千万不能捡了芝麻丢了西瓜。shell
在遇到紧急状况,如线上故障处理时,快速解决问题才是关键。有的时候咱们容易陷入程序员惯有的思惟里,遇到问题会习惯性地一上来就尝试用代码去解决,而忽略了一些非代码的简单处理方式,好比粘贴/复制、excel工具、sublime文本替换等。这里列举两个工做中的小例子,深有感悟。数据库
在一次故障处理过程当中,须要对一批指定用户作一个操做,这个操做能够经过curl请求来完成,当前已有的是已经导出的以userId逐行排列的userIds.txt文件和请求的url,分别长下面这样子:后端
userIds.txt内容: userId1 userId2 userId3 ... userIdn url内容: https://www.yangbing.club/${userId}/doing
当时的第一反应就是准备写个shell脚本或者Java的Job来搞这个事,自己逻辑简单,一层循环就能搞定,伪代码大体以下:数组
userIds <- userIds.txt for userId in userIds: actualUrl = url.replace("${userId}", userId) curl -H 'Cooike: xxx' actualUrl
但恰恰shell又不太熟,还得调试,想一想就头大。此时组里新来的清华实习生给出了简单粗暴的方式,直接在userIds.txt文件上作文章,用sublime的文本替换功能,将文本中每一行,如第一行userId1的行首^
替换为请求url中${userId}
以前的子串curl -H 'Cooike: xxx' https://www.yangbing.club/,将行尾$
替换为url中${userId}
以后的子串**/doing**,这样就获得以下的结果文件:缓存
curl -H 'Cooike: xxx' https://www.yangbing.club/userId1/doing curl -H 'Cooike: xxx' https://www.yangbing.club/userId2/doing curl -H 'Cooike: xxx' https://www.yangbing.club/userId3/doing ... curl -H 'Cooike: xxx' https://www.yangbing.club/userIdn/doing
而后一行命令就能搞定:性能优化
sh userIds.txt
若是处理速度慢了想要并发,又能够经过split命令将userIds.txt按记录行数拆分红多个小文件,而后依次sh,利用操做系统的多进程并发处理。架构
回想这个事情的处理过程,咱们的最终目的实际是为不一样的userId生成对应的url,而后curl请求执行。程序员的固有思惟就是消除重复,尽量复用!对于这种userId不一样,有相同的url模板的典型case,很天然的想到用循环。而忽略了ctrl C/V
这种“重复”的快捷方式。
产品有个导数据的需求,要将特定筛选条件下的用户列表导出为Excel文件。这自己并不难,一个常规的Job就能搞定了。
同事A的方案也很常规,算是比较天然的思路,大概构想了一下代码流程,相似这样:组织筛选代码逻辑,将符合条件的用户列表筛出来,而后将列表转换为行数组,并构建标题数组,再经过Excel三方库或公司已有的工具类,将数据写入Excel文件。在这过程当中,除了筛选条件的代码逻辑外,转为Excel工具须要的数据格式并生成Excel文件,看起来是最耗时的工做。
这看起来好像没啥问题,但笔者并无采用上述方案。咱们来看下这个需求,首先它是个一次性的,数据导出以后就完事了,也没有后续迭代;其次,Excel文件只是产品所须要结果的一种文件格式,咱们只要能确保最终给到产品的是Excel就行,至于咱们是经过代码生成Excel的方式,仍是借用Office Excel强大功能将其余格式的文件转换为Excel的方式,产品并不关心。而咱们又知道,Office Excel能够轻松支持将特定分隔符(如逗号、tab键)的文本文件导入为Excel,于是方案天然就变为:
先筛选出符合条件的用户列表,而后经过log.info将每一个用户记录User的各字段以逗号","分割打印一行,这样咱们就获得了初版数据——日志文件,大概长这样:
......// 启动日志 2019-11-25 23:00:42 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] job start 2019-11-25 23:00:42 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] user info:10506672,"userName1","address1",2 2019-11-25 23:00:42 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] user info:10506673,"userName2","address2",3 2019-11-25 23:00:42 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] user info:10506674,"userName3","address3",2 ...... 2019-11-25 23:00:45 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] user info:10506694,"userName100","address100",1 2019-11-25 23:00:45 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] has processed 100 users 2019-11-25 23:00:45 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] user info:10506694,"userName101","address101",1 ...... 2019-11-25 23:00:42 [INFO] [Thread-17] [org.sherlockyb.blogdemos.ExportUserJob] job end ......// job退出日志
这时候,强大的文本编辑工具sublime就登场了。能够看到,日志中除了含有user info的行尾是咱们须要的数据,其他都是无用信息,冗余数据处理分为以下几步:
同事A后来听我跟他讲完个人实现方案,表示“秀了我一脸”,真实。。。。
好的工具能让咱们极大地提高作事效率。
之前我对于平常开发工具的认知就是,够用就行,不用太深究,专一代码和技术。直到后来,当我见识到周围的朋友如何熟练地经过各类工具快速达到目的的时候,感受真的被秀了一脸。
好的工具备哪些呢?笔者有个推荐清单:
idea 项目名
,你能够快速打开指定的idea项目,这比你每次点击File -> Open -> 选择项目目录 -> ok,但是要快的多!除了上面列的,还有不少平常可用的工具,基本只要你能想到的,都会有。在挖掘新的可用工具的同时,对于已经常常在使用的工具,能够深究,也许你会发现不少好用的feature,用好它,让你事半功倍。
积极主动反映的是良好的工做态度,团队须要积极的氛围,领导更须要积极的人才。
owner精神,则须要较强的责任心,对所参与的业务以及团队负责的业务负责,开发时积极推进项目进度,协调各方优先级,确保项目如期高质量上线;遇到线上故障时,积极响应,确保在最短的时间内解除故障。
没有什么事情是沟通解决不了的,若是有,就屡次沟通。
对上沟通,能让领导对你有所知,有所指望,可能还会有额外的指导,能及时暴露风险,尽早解决;对下沟通,能让你带的小伙伴感觉到温暖,知道你时刻在关注着他,这是正向反馈。另外,你也能及时了解他当前的情况,若有困惑,帮助他解决,让他少走弯路;若有新的想法,拿出来讨论,或许会给你带来新的启发。
我在面试的时候,常常会看这一点。对于爱钻研,有技术追求的候选人,他首先必定是自驱力不错的,由于技术钻研这个事儿纯粹是出于我的意愿,能坚持下来,不容易。其次,他对于技术是有好奇心的,好奇心会驱使他去研究这里面的细节,搞清楚原理,不会浮于表面。
技术架构必定是依托于业务的。
公司发展的不一样阶段,业务量级的不一样,所须要的技术架构是不同的。初创期,业务规模小,产品迭代速度快,此时须要的是快速支持,快速开发,好比不少统计数据的场景就直接实时计算了,后端服务可能就是一个单体应用,这些都是能够接受的;随着业务发展,业务形态多样化,用户量快速增加,致使系统压力、复杂度倍增,此时就须要考虑微服务拆分、分布式、性能优化、Redis缓存、分库拆表等技术方案了。
技术架构除了要考虑可否支持业务发展,技术先进性外,也要考虑成本,这里面既有数据库、服务节点等资源成本,也有开发成本,更多时候是取一种折中方案,收益最大化。
过去的经验能让咱们在处理新的问题时有参考依据,尽可能少走弯路,一般这是没问题的。但有一个误区是,过度相信此前的经验,认为那绝对是对的。工做中就遇到过这类case,关于thrift新增字段,是否须要设置为optional的,同事A很自信地认为用默认的required就行,由于以前这么干过没问题。但很快实验代表,新增required字段,会致使新老版本不兼容,call端会报异常。
经验有对有错,咱们须要有质疑心态,不能尽信之。
同步到原文