2023年6月20日发(作者:)
程序员职业思考与规划——Java程序员年度总结:浅谈四点⼼得,也许路⾛得更远⼀、技术积累(1)代码规范1.1.1、通常的模块分布:⼀般如果你要实现⼀个web应⽤,你从后台将数据展⽰到前端页⾯,在⼀个⽐较⼤的公司,你少不了跟其他项⽬有交集(你调⽤他的接⼝,他依赖你的接⼝),这样下来,整个公司有很多个模块,怎么做到很好的联系。回到刚刚的模块分布,你的⼀个web应⽤,应当需要分成三个模块:core模块、service模块、web模块。web模块就是展⽰到页⾯,后台代码⽽⾔主要就controller层了,其他逻辑基本都放在core了,service模块就是⼀些接⼝类和参数dto等等,接⼝的实现类在core模块。这样下来,web模块只需要依赖service模块,同样的其他系统依赖你的接⼝也仅仅是依赖service模块,然后利⽤远程调⽤⽅式消费你的接⼝服务。1.1.2、代码层级结构:针对后台服务项⽬,⼀般分为对外接⼝层、service层、Dao层。Dao层就是与交接的接⼝层,service层主要调⽤Dao或者外部系统的接⼝,复杂的逻辑基本都放在service层;⼀些⽅法需要提供给其他模块调⽤的时候,就封装在对外接⼝层,只有对外接⼝层是暴露。这⾥说的只是层级结构,还有与层级结构⽆关的,也是需要归类的,⽐如对外部系统接⼝⽅法封装的我们放在⼀个⽬录下⾯,⼀些常量和⼯具类等我们放在common⽬录下⾯。当然还有其他考虑,尽量让整个模块有层次感,代码才不会太乱,更好的维护。1.1.3、总结上⾯两点:可能不少猿友觉得上⾯啰嗦⼜不像代码规范,其实这两点也是代码规范的⼀部分,主要引导⼤家往结构清晰好维护的思维⽅向⾛,多思考吧。1.1.4、对于⼀些需要异步处理的,不要直接new⼀个thread,应当使⽤线程池。使⽤线程池的时候应当对线程数量⼤⼩合理设置,⼀般最⼤不超过50个,当然还需要考虑你的IO和CPU,怎么分析⽹上搜搜吧。1.1.5、容器类变量,如果变化⽐较⼤且频繁,尽量定义的时候设置初始容量⼤⼩,减少扩容带来的消耗。1.1.6、分⽀判断if…else的时候,最常符合的条件处理放在前⾯。1.1.7、对象⽐较的时候常量放前⾯,养成好习惯,减少空指针的出现。1.1.8、减少synchronized中等待处理的代码,能放在外⾯就尽量放在外⾯。1.1.9、下⾯到数据库了,我觉得还是在这⾥说了好点,⼀般查询⽐较慢,很有可能是没有建索引或者索引没⽤到,多去检查⼀下。1.1.10、两个⼤表的关联查询,可以使⽤⼆次访问数据库替代,先查出A表的数据,利⽤关联字段再查B表的。不要⼀味想着⼀条sql搞定最好。1.1.11、坚决避免,查全表数据或者数量⼤的数据,返回list加载到内存中,⼀不⼩⼼查了100w数据,⼜查得⽐较频繁,内存的爆了。有这种风险的改成分页查询。1.1.12、不要select *,按需取列。1.1.13、多考虑避免事务⾥⾯有长连接或者长事务,如果⼤量这种情况出现占⽤数据连接,会影响性能。⼀些⽆必要的逻辑可以放到事务外执⾏。1.1.14、对字段的加减乘除处理放到sql,严格避免先get处理,然后运算在set到数据库⾥⾯,并发情况⾮常容易导致失真。1.1.15、⽅法⾥⾯代码不要太长,注意封装,命名语义化,代码整洁。常挂嘴边的,没放⼼上,⼀如既往的给⾃⼰埋坑,举个博主的例⼦,那会刚毕业也是没放⼼上,最近把我们组长不写代码,⼀到代码评审我就害怕,检视到有问题的代码,毕业⽣吧就说这代码以前就是这样写的,问题最终肯定都落我⾝上,现在感觉代码是⾃⼰的孩⼦,只能有空⾃⼰偷偷的优化⼀下,怕出问题还得⾮常仔细。(2)SQL规范与性能优化1.2.1、先提前声明,博主⼯作⽤到是,可能有些场景只针对MySQL。说到SQL优化,⼀些概念必须要理解,不然死记硬背⼀两天就忘记了。特别是执⾏计划的概念。1.2.2、什么是执⾏计划:a.决定如何访问表数据,是否通过索引,是否排序等。b.多表关联是先访问哪个表。c.多表关联时,使⽤哪种连接⽅式,不过现在MySQL只有嵌套连接(嵌套循环,顾名思义就是将⼀个表为出发点,将该表全部记录逐条去遍历另外⼀张表的记录)。1.2.3、SQL执⾏顺序:a.检查语法是否正确。b.检查表是否存在、权限是否满⾜等。c.根据统计信息(如datalength,rows,index length、索引唯⼀度),⽣成较优的执⾏计划。d.根据执⾏计划,进⾏数据检索、过滤、合并、排序等操作。访问数据时,内存中如存在表数据,则直接进⾏操作;否则,从磁带读取表数据,放⼊内存,再进⾏操作;如内存不⾜,则内存中较冷数据涮出内存,再从内存中读取数据。1.2.4、索引:查询的时候如果使⽤上了索引,可以提⾼效率,因为建⽴了索引后,可以理解为数据字典的结构存储,因此根据条件查询的时候更加⾼效。下⾯看⼀下MySQL常⽤的索引类型的概念。
a.普通索引:在创建普通索引时,不附加任何限制条件。这类索引可以创建在任何数据类型中,其值是否唯⼀和⾮空由字段本⾝的完整性约束条件决定。建⽴索引以后,查询时可以通过索引进⾏查询。例如,在student表的stu_id字段上建⽴⼀个普通索引。查询记录时,就可以根据该索引进⾏查询。b.唯⼀性索引:使⽤UNIQUE参数可以设置索引为唯⼀性索引。在创建唯⼀性索引时,限制该索引的值必须是唯⼀的。例如,在student表的stu_name字段中创建唯⼀性索引,那么stu_name字段的值就必需是唯⼀的。通过唯⼀性索引,可以更快速地确定某条记录。主键就是⼀种特殊唯⼀性索引。c.单列索引:在表中的单个字段上创建索引。单列索引只根据该字段进⾏索引。单列索引可以是普通索引,也可以是唯⼀性索引,还可以是全⽂索引。只要保证该索引只对应⼀个字段 即可。d.多列索引:多列索引是在表的多个字段上创建⼀个索引。该索引指向创建时对应的多个字段,可以通过这⼏个字段进⾏查询。但是,只有查询条件中使⽤了这些字段中第⼀个字段时,索引才会被使⽤。例如,在表中的id、name和sex字段上建⽴⼀个多列索引,那么,只有查询条件使⽤了id字段时该索引才会被使⽤。e . 全⽂索引:使⽤FULLTEXT参数可以设置索引为全⽂索引。全⽂索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。查询数据量较⼤的字符串类型的字段时,使⽤全⽂索引可以提⾼查询速度。例如,student表的information字段是TEXT类型,该字段包含了很多的⽂字信息。在information字段上建⽴全⽂索引后,可以提⾼查询information字段的速度。MySQL数据库从3.23.23版开始⽀持全⽂索引,但只有MyISAM存储引擎⽀持全⽂检索。在默认情况下,全⽂索引的搜索执⾏⽅式不区分⼤⼩写。但索引的列使⽤⼆进制排序后,可以执⾏区分⼤⼩写的全⽂索引。还有空间索引,平时也⽐较少⽤。⽬前只有MyISAM存储引擎⽀持空间检索。⽬前博主也只接触过InnoDB存储引擎。1.2.5、⼀般⼀张表索引不要超过5个,⽽且避免重复索引,⽽且也不是建了索引,根据索引字段条件查询,索引就会起作⽤。1.2.6、⼀般哪些场景会导致索引失效:a.使⽤like关键字匹配字符串第⼀个为”%”的场景。b.条件中包含or、in、not in、<>关键字,默认不⾛索引的。c.访问表上的数据⾏超出表总记录数30%,变成全表扫描。d.查询条件使⽤函数在索引列上,或者对索引列进⾏运算。e.多列索引中,第⼀个索引列使⽤范围查询,只能⽤到部份或⽆法使⽤索引。f.多列索引中,第⼀个查询条件不是最左索引列,上⾯多列索引概念中也有提到。肯定还有更多的场景,但是博主现在能想到的场景就这些了。1.2.7、不能同时使⽤两个索引,⼀个过滤数据,⼀个⽤于排序(主键除外)。1.2.8、DML语句如果使⽤索引,会导致lock全表;如果使⽤了⾮唯⼀索引,可能只是锁住⼀定范围。对此,建议更新/删除数据尽量⽤上索引,如果可以最好⽤上主键或唯⼀索引,另外事务要及时提交。(3)关于事务的⼀些建议如果没有听过事务这么个概念,⽹上了解学习⼀下,先理解⼀下各个事务类型的含义吧:a.⽇志记录尽量放在独⽴事务⾥⾯,避免后⾯的异常发⽣导致⽇志丢失。b.上⾯已经⼏次提到,尽早提交事务,避免事务过长,因此写代码的时候,⼀些可以不放到事务的逻辑可以移到外⾯,长事务看能否拆成两个事务。(4)关于数据库连接池可能⼀些猿友都少去注意吧。先来看看⼀些参数,这⾥只罗列了博主⽐较关注的,更多的可以⾃⾏查看⼀下配置。
initialSize : 默认值是 0, 连接池创建连接的初始连接数⽬。
minIdle : 默认是 0, 连接数中最⼩空闲连接数。
maxIdle : 默认是 8 ,连接池中最⼤空闲连接数。
maxActive : 默认值是 8, 连接池中同时可以分派的最⼤活跃连接数。
maxWait : 默认值是⽆限⼤,当连接池中连接已经⽤完了,等待建⽴⼀个新连接的最⼤毫秒数 ( 在抛异常之前 )。
validationQuery : ⼀条 sql 语句,⽤来验证数据库连接是否正常。这条语句必须是⼀个查询模式,并⾄少返回⼀条数据。⼀般⽤“ select 1 ”。
minEvictableIdleTimeMilis : 默认值是 1000 * 60 * 30(30 分钟 ) 单位也是毫秒,连接池中连接可空闲的时间。
timeBetweenEvictionRunsMilis : 默认值是 -1 ,每隔⼀段多少毫秒跑⼀次回收空闲线程的线程。对于minEvictableIdleTimeMilis、timeBetweenEvictionRunsMilis这两个参数,timeBetweenEvictionRunsMilis必须⼤于1且⼩于minEvictableIdleTimeMilis,建议是minEvictableIdleTimeMilis的五分之⼀或⼗分之⼀。(5)对于前端的⼏点建议。1.7.1、⼀些图⽚压缩后再使⽤,性能⽅⾯提⾼不⼩吧(可以使⽤熊猫图⽚压缩)。虽然⾃⼰前端⽐较菜,但是估计也有不少猿友跟我⼀样偶尔需要兼顾前端吧。毕竟刚毕业不久。1.7.2、关于移动端页⾯重构兼容不同屏幕⼤⼩的问题,建议doc的fontSize,实时获取屏幕的宽度,然后除以320再乘以16,当然16可以根据⾃⼰情况去调。然后其他⼀些单位尽量⽤rem,这样⽆论什么⼤⼩的屏幕都等⽐例缩放。感觉⽐@media效果好很多。关于技术积累这⼀块,之前罗列的提纲还挺多的,写到后⾯感觉没什么精⼒了,有些三⾔两语似乎说不清楚啊。⼆、⼯作⼼得(1)沟通协作第⼀:⼯作中必然少不了团队协作,积极主动去沟通的⼈做事总是更加靠谱。道理⼤家都懂。但是我们需要把想法问题,简洁明确的表达给对⽅。另外总是以沟通的⼼态⾯对问题,⽽不是抱怨。如果觉得上级分配的任务难度太⼤了,你可以尝试跟他沟通,获取他有很好的建议或解决⽅案。(2)谨慎记录与排漏:感觉现在挺经常是开⼀两个会,同时偶尔找你排查⼀下环境问题,⼀天下来其实写代码的时间并不多。⼀些关键点,⾮常建议提前记录下来,⽅便接回被打断的思路,同时避免⼀些逻辑或功能点的遗漏。(3)思路清晰与效率:建议动⼿写代码之前,建议先理清思路,关键逻辑,需求细节,这样后⾯写代码的时候效率⽐较⾼,⽽且质量也⽐较好。(4)主动与多管闲事:清楚⾃⼰的⼯作范围,⾃⼰⼼⾥有个界限,有些属于别⼈⼯作范围的事情,可以你提出的建议是好的,但是最好还是在合适的场景和时机提出。(5)⼼态与⼯作状态:程序员,总会有被坑的时候,或者不顺⼼的时候,尽量尝试控制⼀下⾃⼰的⼼态。(6)可持续发展观看待技术与业务:这点是我⾃⼰希望做到的。对于责任⼼⽽⾔,或者是说⼀个优秀的程序员。很多时候并不是完成产品提的需求就好了。多为它着想,代码可维护性和扩展性⾼不⾼。⼀些功能点也可以提出⾃⼰的想法,不要总是被动的接受产品的需求,业务功能拓展性好的话,可以减少产品改动需求。三、学习⽅向与职业发展(1)先⼴后深还是先深后⼴:对于博主⽽⾔,其实接触的技术点还算⽐较多的,但是了解的都不深⼊,个⼈性格⽽⾔,⽐较偏向于实⽤驱动,如果在实际使⽤场景有⽤到再去深⼊学习,这样边学边⽤才能⽐较集中注意⼒。像⼀些同事,他们喜欢把⼀样东西研究得很深。(2)业务经验也应当注重:技术⼈员必然是技术优先,但是等你到了⼀定⼯作年限,其实业务经验也是⾮常重要了。之前领导找我年度⼯作谈话就有说过他们招⾼级⼯程师的时候对业务经验也⾮常看重,是否有⾃⼰独特的见解。相信道理⼤家都懂,但是平时有没有这样的意识,有没有去做⼜是另外⼀⽅⾯了。平时也可以多学习业务⽅⾯的知识。(3)相同的⼯作年限为什么当过项⽬经理的⼈更吃⾹:因为他们对业务理解更加深⼊,代码质量问题落在他头上,项⽬的⼈员协调与时间安排规划,责任越⼤,思考的问题就越多,遇到的问题处理经验就越丰富。把控能⼒也⽐较强。(4)怎样能进⼊学习状态,并且坚持:要想集中注意⼒学习技术,需要安静的环境,需要耐得住寂寞,因此你需要没有⼈打扰的环境,⽐如在⼀个集体居住环境,⼏个朋友⼀起住,⼀般多数回想着去哪玩,朋友在玩游戏,估计也是对你的⼀种诱惑吧。可以早点到办公室学习或下班学习⼀段时间再回去。或者选择⾃⼰⼀个⼈住。(5)如何把握住学习的时机:学习最能集中注意⼒的情况是有着⽐较强的好奇⼼和求知欲。所以⼀般⼀些技术分享或者⽼员⼯讨论的问题,可能很多概念知识你都不懂,这时候你就可以去学习了解这些知识。或者你⼯作中遇到的问题,尽量刨根问底的去弄清楚是什么原因导致的,不要⼀些⽼司机帮忙解决了就⼀了了之。或者是其他同事遇到的问题,你都可以去了解⼀下。(6)你更适合⾛⼀条怎样的职业道路:刚毕业不久的猿友,⼀般都是会⽐较⼼浮⽓躁的,对技术求知欲很强,特别是⼀些⾼⼤上的技术,什么、、等等,有些偏向于技术研究,有些偏向于业务。⼤部分程序员可能都会选择偏向于技术研究的,于是乎对偏向业务的不怎么感冒,因此觉得天天做这些东西没什么意思。这时候,静下来分析⼀下,你到底适合哪种⽅向。你能否静下⼼来对技术研究很深⼊,能否耐得住寂寞。四、关于⽣活(1)良好与糟糕的⽣活状态的区别:需要警惕⼀下⾃⼰是否进⼊了⼀种糟糕的⽣活状态,⼯作上不温不⽕,似乎现在的技术已经⾜够⽤了,完全没有⽬标没有计划,⽆法集中注意⼒学习,⽇⼦就这样⼀天天过去。(2)17年⾃⼰的⼀些期望吧:希望活得更坚定些,保持着⼀定的求知欲和规划,向成为⾃⼰希望成为的⼈努⼒吧,包括⼀些习惯、处事⽅式等等。
2023年6月20日发(作者:)
程序员职业思考与规划——Java程序员年度总结:浅谈四点⼼得,也许路⾛得更远⼀、技术积累(1)代码规范1.1.1、通常的模块分布:⼀般如果你要实现⼀个web应⽤,你从后台将数据展⽰到前端页⾯,在⼀个⽐较⼤的公司,你少不了跟其他项⽬有交集(你调⽤他的接⼝,他依赖你的接⼝),这样下来,整个公司有很多个模块,怎么做到很好的联系。回到刚刚的模块分布,你的⼀个web应⽤,应当需要分成三个模块:core模块、service模块、web模块。web模块就是展⽰到页⾯,后台代码⽽⾔主要就controller层了,其他逻辑基本都放在core了,service模块就是⼀些接⼝类和参数dto等等,接⼝的实现类在core模块。这样下来,web模块只需要依赖service模块,同样的其他系统依赖你的接⼝也仅仅是依赖service模块,然后利⽤远程调⽤⽅式消费你的接⼝服务。1.1.2、代码层级结构:针对后台服务项⽬,⼀般分为对外接⼝层、service层、Dao层。Dao层就是与交接的接⼝层,service层主要调⽤Dao或者外部系统的接⼝,复杂的逻辑基本都放在service层;⼀些⽅法需要提供给其他模块调⽤的时候,就封装在对外接⼝层,只有对外接⼝层是暴露。这⾥说的只是层级结构,还有与层级结构⽆关的,也是需要归类的,⽐如对外部系统接⼝⽅法封装的我们放在⼀个⽬录下⾯,⼀些常量和⼯具类等我们放在common⽬录下⾯。当然还有其他考虑,尽量让整个模块有层次感,代码才不会太乱,更好的维护。1.1.3、总结上⾯两点:可能不少猿友觉得上⾯啰嗦⼜不像代码规范,其实这两点也是代码规范的⼀部分,主要引导⼤家往结构清晰好维护的思维⽅向⾛,多思考吧。1.1.4、对于⼀些需要异步处理的,不要直接new⼀个thread,应当使⽤线程池。使⽤线程池的时候应当对线程数量⼤⼩合理设置,⼀般最⼤不超过50个,当然还需要考虑你的IO和CPU,怎么分析⽹上搜搜吧。1.1.5、容器类变量,如果变化⽐较⼤且频繁,尽量定义的时候设置初始容量⼤⼩,减少扩容带来的消耗。1.1.6、分⽀判断if…else的时候,最常符合的条件处理放在前⾯。1.1.7、对象⽐较的时候常量放前⾯,养成好习惯,减少空指针的出现。1.1.8、减少synchronized中等待处理的代码,能放在外⾯就尽量放在外⾯。1.1.9、下⾯到数据库了,我觉得还是在这⾥说了好点,⼀般查询⽐较慢,很有可能是没有建索引或者索引没⽤到,多去检查⼀下。1.1.10、两个⼤表的关联查询,可以使⽤⼆次访问数据库替代,先查出A表的数据,利⽤关联字段再查B表的。不要⼀味想着⼀条sql搞定最好。1.1.11、坚决避免,查全表数据或者数量⼤的数据,返回list加载到内存中,⼀不⼩⼼查了100w数据,⼜查得⽐较频繁,内存的爆了。有这种风险的改成分页查询。1.1.12、不要select *,按需取列。1.1.13、多考虑避免事务⾥⾯有长连接或者长事务,如果⼤量这种情况出现占⽤数据连接,会影响性能。⼀些⽆必要的逻辑可以放到事务外执⾏。1.1.14、对字段的加减乘除处理放到sql,严格避免先get处理,然后运算在set到数据库⾥⾯,并发情况⾮常容易导致失真。1.1.15、⽅法⾥⾯代码不要太长,注意封装,命名语义化,代码整洁。常挂嘴边的,没放⼼上,⼀如既往的给⾃⼰埋坑,举个博主的例⼦,那会刚毕业也是没放⼼上,最近把我们组长不写代码,⼀到代码评审我就害怕,检视到有问题的代码,毕业⽣吧就说这代码以前就是这样写的,问题最终肯定都落我⾝上,现在感觉代码是⾃⼰的孩⼦,只能有空⾃⼰偷偷的优化⼀下,怕出问题还得⾮常仔细。(2)SQL规范与性能优化1.2.1、先提前声明,博主⼯作⽤到是,可能有些场景只针对MySQL。说到SQL优化,⼀些概念必须要理解,不然死记硬背⼀两天就忘记了。特别是执⾏计划的概念。1.2.2、什么是执⾏计划:a.决定如何访问表数据,是否通过索引,是否排序等。b.多表关联是先访问哪个表。c.多表关联时,使⽤哪种连接⽅式,不过现在MySQL只有嵌套连接(嵌套循环,顾名思义就是将⼀个表为出发点,将该表全部记录逐条去遍历另外⼀张表的记录)。1.2.3、SQL执⾏顺序:a.检查语法是否正确。b.检查表是否存在、权限是否满⾜等。c.根据统计信息(如datalength,rows,index length、索引唯⼀度),⽣成较优的执⾏计划。d.根据执⾏计划,进⾏数据检索、过滤、合并、排序等操作。访问数据时,内存中如存在表数据,则直接进⾏操作;否则,从磁带读取表数据,放⼊内存,再进⾏操作;如内存不⾜,则内存中较冷数据涮出内存,再从内存中读取数据。1.2.4、索引:查询的时候如果使⽤上了索引,可以提⾼效率,因为建⽴了索引后,可以理解为数据字典的结构存储,因此根据条件查询的时候更加⾼效。下⾯看⼀下MySQL常⽤的索引类型的概念。
a.普通索引:在创建普通索引时,不附加任何限制条件。这类索引可以创建在任何数据类型中,其值是否唯⼀和⾮空由字段本⾝的完整性约束条件决定。建⽴索引以后,查询时可以通过索引进⾏查询。例如,在student表的stu_id字段上建⽴⼀个普通索引。查询记录时,就可以根据该索引进⾏查询。b.唯⼀性索引:使⽤UNIQUE参数可以设置索引为唯⼀性索引。在创建唯⼀性索引时,限制该索引的值必须是唯⼀的。例如,在student表的stu_name字段中创建唯⼀性索引,那么stu_name字段的值就必需是唯⼀的。通过唯⼀性索引,可以更快速地确定某条记录。主键就是⼀种特殊唯⼀性索引。c.单列索引:在表中的单个字段上创建索引。单列索引只根据该字段进⾏索引。单列索引可以是普通索引,也可以是唯⼀性索引,还可以是全⽂索引。只要保证该索引只对应⼀个字段 即可。d.多列索引:多列索引是在表的多个字段上创建⼀个索引。该索引指向创建时对应的多个字段,可以通过这⼏个字段进⾏查询。但是,只有查询条件中使⽤了这些字段中第⼀个字段时,索引才会被使⽤。例如,在表中的id、name和sex字段上建⽴⼀个多列索引,那么,只有查询条件使⽤了id字段时该索引才会被使⽤。e . 全⽂索引:使⽤FULLTEXT参数可以设置索引为全⽂索引。全⽂索引只能创建在CHAR、VARCHAR或TEXT类型的字段上。查询数据量较⼤的字符串类型的字段时,使⽤全⽂索引可以提⾼查询速度。例如,student表的information字段是TEXT类型,该字段包含了很多的⽂字信息。在information字段上建⽴全⽂索引后,可以提⾼查询information字段的速度。MySQL数据库从3.23.23版开始⽀持全⽂索引,但只有MyISAM存储引擎⽀持全⽂检索。在默认情况下,全⽂索引的搜索执⾏⽅式不区分⼤⼩写。但索引的列使⽤⼆进制排序后,可以执⾏区分⼤⼩写的全⽂索引。还有空间索引,平时也⽐较少⽤。⽬前只有MyISAM存储引擎⽀持空间检索。⽬前博主也只接触过InnoDB存储引擎。1.2.5、⼀般⼀张表索引不要超过5个,⽽且避免重复索引,⽽且也不是建了索引,根据索引字段条件查询,索引就会起作⽤。1.2.6、⼀般哪些场景会导致索引失效:a.使⽤like关键字匹配字符串第⼀个为”%”的场景。b.条件中包含or、in、not in、<>关键字,默认不⾛索引的。c.访问表上的数据⾏超出表总记录数30%,变成全表扫描。d.查询条件使⽤函数在索引列上,或者对索引列进⾏运算。e.多列索引中,第⼀个索引列使⽤范围查询,只能⽤到部份或⽆法使⽤索引。f.多列索引中,第⼀个查询条件不是最左索引列,上⾯多列索引概念中也有提到。肯定还有更多的场景,但是博主现在能想到的场景就这些了。1.2.7、不能同时使⽤两个索引,⼀个过滤数据,⼀个⽤于排序(主键除外)。1.2.8、DML语句如果使⽤索引,会导致lock全表;如果使⽤了⾮唯⼀索引,可能只是锁住⼀定范围。对此,建议更新/删除数据尽量⽤上索引,如果可以最好⽤上主键或唯⼀索引,另外事务要及时提交。(3)关于事务的⼀些建议如果没有听过事务这么个概念,⽹上了解学习⼀下,先理解⼀下各个事务类型的含义吧:a.⽇志记录尽量放在独⽴事务⾥⾯,避免后⾯的异常发⽣导致⽇志丢失。b.上⾯已经⼏次提到,尽早提交事务,避免事务过长,因此写代码的时候,⼀些可以不放到事务的逻辑可以移到外⾯,长事务看能否拆成两个事务。(4)关于数据库连接池可能⼀些猿友都少去注意吧。先来看看⼀些参数,这⾥只罗列了博主⽐较关注的,更多的可以⾃⾏查看⼀下配置。
initialSize : 默认值是 0, 连接池创建连接的初始连接数⽬。
minIdle : 默认是 0, 连接数中最⼩空闲连接数。
maxIdle : 默认是 8 ,连接池中最⼤空闲连接数。
maxActive : 默认值是 8, 连接池中同时可以分派的最⼤活跃连接数。
maxWait : 默认值是⽆限⼤,当连接池中连接已经⽤完了,等待建⽴⼀个新连接的最⼤毫秒数 ( 在抛异常之前 )。
validationQuery : ⼀条 sql 语句,⽤来验证数据库连接是否正常。这条语句必须是⼀个查询模式,并⾄少返回⼀条数据。⼀般⽤“ select 1 ”。
minEvictableIdleTimeMilis : 默认值是 1000 * 60 * 30(30 分钟 ) 单位也是毫秒,连接池中连接可空闲的时间。
timeBetweenEvictionRunsMilis : 默认值是 -1 ,每隔⼀段多少毫秒跑⼀次回收空闲线程的线程。对于minEvictableIdleTimeMilis、timeBetweenEvictionRunsMilis这两个参数,timeBetweenEvictionRunsMilis必须⼤于1且⼩于minEvictableIdleTimeMilis,建议是minEvictableIdleTimeMilis的五分之⼀或⼗分之⼀。(5)对于前端的⼏点建议。1.7.1、⼀些图⽚压缩后再使⽤,性能⽅⾯提⾼不⼩吧(可以使⽤熊猫图⽚压缩)。虽然⾃⼰前端⽐较菜,但是估计也有不少猿友跟我⼀样偶尔需要兼顾前端吧。毕竟刚毕业不久。1.7.2、关于移动端页⾯重构兼容不同屏幕⼤⼩的问题,建议doc的fontSize,实时获取屏幕的宽度,然后除以320再乘以16,当然16可以根据⾃⼰情况去调。然后其他⼀些单位尽量⽤rem,这样⽆论什么⼤⼩的屏幕都等⽐例缩放。感觉⽐@media效果好很多。关于技术积累这⼀块,之前罗列的提纲还挺多的,写到后⾯感觉没什么精⼒了,有些三⾔两语似乎说不清楚啊。⼆、⼯作⼼得(1)沟通协作第⼀:⼯作中必然少不了团队协作,积极主动去沟通的⼈做事总是更加靠谱。道理⼤家都懂。但是我们需要把想法问题,简洁明确的表达给对⽅。另外总是以沟通的⼼态⾯对问题,⽽不是抱怨。如果觉得上级分配的任务难度太⼤了,你可以尝试跟他沟通,获取他有很好的建议或解决⽅案。(2)谨慎记录与排漏:感觉现在挺经常是开⼀两个会,同时偶尔找你排查⼀下环境问题,⼀天下来其实写代码的时间并不多。⼀些关键点,⾮常建议提前记录下来,⽅便接回被打断的思路,同时避免⼀些逻辑或功能点的遗漏。(3)思路清晰与效率:建议动⼿写代码之前,建议先理清思路,关键逻辑,需求细节,这样后⾯写代码的时候效率⽐较⾼,⽽且质量也⽐较好。(4)主动与多管闲事:清楚⾃⼰的⼯作范围,⾃⼰⼼⾥有个界限,有些属于别⼈⼯作范围的事情,可以你提出的建议是好的,但是最好还是在合适的场景和时机提出。(5)⼼态与⼯作状态:程序员,总会有被坑的时候,或者不顺⼼的时候,尽量尝试控制⼀下⾃⼰的⼼态。(6)可持续发展观看待技术与业务:这点是我⾃⼰希望做到的。对于责任⼼⽽⾔,或者是说⼀个优秀的程序员。很多时候并不是完成产品提的需求就好了。多为它着想,代码可维护性和扩展性⾼不⾼。⼀些功能点也可以提出⾃⼰的想法,不要总是被动的接受产品的需求,业务功能拓展性好的话,可以减少产品改动需求。三、学习⽅向与职业发展(1)先⼴后深还是先深后⼴:对于博主⽽⾔,其实接触的技术点还算⽐较多的,但是了解的都不深⼊,个⼈性格⽽⾔,⽐较偏向于实⽤驱动,如果在实际使⽤场景有⽤到再去深⼊学习,这样边学边⽤才能⽐较集中注意⼒。像⼀些同事,他们喜欢把⼀样东西研究得很深。(2)业务经验也应当注重:技术⼈员必然是技术优先,但是等你到了⼀定⼯作年限,其实业务经验也是⾮常重要了。之前领导找我年度⼯作谈话就有说过他们招⾼级⼯程师的时候对业务经验也⾮常看重,是否有⾃⼰独特的见解。相信道理⼤家都懂,但是平时有没有这样的意识,有没有去做⼜是另外⼀⽅⾯了。平时也可以多学习业务⽅⾯的知识。(3)相同的⼯作年限为什么当过项⽬经理的⼈更吃⾹:因为他们对业务理解更加深⼊,代码质量问题落在他头上,项⽬的⼈员协调与时间安排规划,责任越⼤,思考的问题就越多,遇到的问题处理经验就越丰富。把控能⼒也⽐较强。(4)怎样能进⼊学习状态,并且坚持:要想集中注意⼒学习技术,需要安静的环境,需要耐得住寂寞,因此你需要没有⼈打扰的环境,⽐如在⼀个集体居住环境,⼏个朋友⼀起住,⼀般多数回想着去哪玩,朋友在玩游戏,估计也是对你的⼀种诱惑吧。可以早点到办公室学习或下班学习⼀段时间再回去。或者选择⾃⼰⼀个⼈住。(5)如何把握住学习的时机:学习最能集中注意⼒的情况是有着⽐较强的好奇⼼和求知欲。所以⼀般⼀些技术分享或者⽼员⼯讨论的问题,可能很多概念知识你都不懂,这时候你就可以去学习了解这些知识。或者你⼯作中遇到的问题,尽量刨根问底的去弄清楚是什么原因导致的,不要⼀些⽼司机帮忙解决了就⼀了了之。或者是其他同事遇到的问题,你都可以去了解⼀下。(6)你更适合⾛⼀条怎样的职业道路:刚毕业不久的猿友,⼀般都是会⽐较⼼浮⽓躁的,对技术求知欲很强,特别是⼀些⾼⼤上的技术,什么、、等等,有些偏向于技术研究,有些偏向于业务。⼤部分程序员可能都会选择偏向于技术研究的,于是乎对偏向业务的不怎么感冒,因此觉得天天做这些东西没什么意思。这时候,静下来分析⼀下,你到底适合哪种⽅向。你能否静下⼼来对技术研究很深⼊,能否耐得住寂寞。四、关于⽣活(1)良好与糟糕的⽣活状态的区别:需要警惕⼀下⾃⼰是否进⼊了⼀种糟糕的⽣活状态,⼯作上不温不⽕,似乎现在的技术已经⾜够⽤了,完全没有⽬标没有计划,⽆法集中注意⼒学习,⽇⼦就这样⼀天天过去。(2)17年⾃⼰的⼀些期望吧:希望活得更坚定些,保持着⼀定的求知欲和规划,向成为⾃⼰希望成为的⼈努⼒吧,包括⼀些习惯、处事⽅式等等。
发布评论