一、背景
程序员学到一定程度,更倾向于把技术、工作、生活联系起来,发现一些共性。
利用生活知识去类比来学习技术,并且利用技术知识反向促进生活效率的改进。
本文介绍几个提高工作效率的技巧。
下面举几个栗子。
二、举两个例子
2.1 多线程并发的思维
如果是单线程卡住了,后续任务就无法执行。Java多线程是一个很重要的概念,可以并发执行。
图 2.1
这就像我们写代码的时候如果卡壳了,可能没有及时切换到其他的任务,可能一直卡几分钟,几十分钟甚至几个小时。
其实人脑就像单核CPU,我们通过并发的形式完成更多的任务。
如果在某个地方卡住,如果不是很紧急切换到其他任务上,然后再切换回来搞(搞不定寻求帮助,有时候自己怎么都看不出来,别人一下就get到原因,节省很多时间),可以实现整体效率的最大化。
2.2 优先级队列思维
那么工作上也是这样,很少只有一项任务,可能干着干着新的任务就得插进来。
这有点像优先队列,优先级高的在前面。
注:下图并不是画优先级队列的底层结构图,只是一种方便理解的图示。
图2.2-1
如果新任务优先级更高,那么抓紧切换到新任务上去。
图2.2-2
比如任务a刚要执行完,任务d进来,d的优先级高,插入到b前面。
这里的优先级往往只是一个维度,如重要性,如紧急程度。
但是我们不能只根据紧急程度来决定优先级,有一个经典的四象限法则来指导我们的工作生活。
图2.2-3
四象限法则是时间管理理论的一个重要观念是应有重点地把主要的精力和时间集中地放在处理那些重要但不紧急的工作上,这样可以做到未雨绸缪,防患于未然。在人们的日常工作中,很多时候往往有机会去很好地计划和完成一件事。 但常常却又没有及时地去做,随着时间的推移,造成工作质量的下降。 因此,应把主要的精力有重点地放在重要但不紧急这个“象限”的事务上是必要的。 要把精力主要放在重要但不紧急的事务处理上,需要很好地安排时间。 一个好的方法是建立预约。建立了预约,自己的时间才不会被别人所占据,从而有效地开展工作。 《百度百科》
只有平时多花点时间在重要且不紧急的事情上时,才会减少重要紧急的事项。
或者关注重要紧急的事项的同时,不要忽略重要不紧急的事项。
比如工作的时候,完成项目的人开发是重要紧急的任务,但是业余时间巩固专业基础,阅读专业经典图书,学习核心技术栈的源码等等则是 重要且不紧急的任务。
这些重要且不紧急的任务对发展帮助巨大,且反向促进未来的项目开发等。
这就像很多大学生报名了四六级,然后优哉游哉,然后快考试了突击一下,有些基础差的就一次又一次不过。
期末考试带有原题,期末考试难度低一些,期末考试可以突击,导致很多人养成了这种思维惯性,另外人总是懒惰的,很多事情总是到了眼前才着急,有些事情太晚了就回天无数了。
2.3 线程切换的消耗思维
另外我们知道线程频繁常见和销毁,线程的切换等都消耗时间,这个和工作的时候频繁切换工作内容每一次切换都会浪费时间。,
过去我们只需要高效地完成大量重复性任务,所以“切换和更换”并不重要。 如今,我们面对的任务总是不断地,一点点地变化着形态。 为了适应这种变化,我们不能再一心二用,应是应该:把经历用在缩短不同工作的切换时间上。 《整理的艺术2》 时间整理术 05 切勿一心二用
当任务少的时候,用多线程来执行,反而耗时可能更长,就是这个原因。
如图2.1所示,多个任务切换中间是有“间隙”的,而且人脑并不是机器,这个间隙可能会很长,中断后切换到新的任务可能要几分钟甚至十几分钟的“适应期”。
所以很多程序员都愿意带着耳机,避免被打扰造成“上下文切换”。
另外我提一点减少上下文切换耗时的技巧
(1)用有道云笔记记录关键的信息。比如在某个任务目录,分别创建需求、开发、测试、上线等目录,然后将每个阶段用到的链接,注意事项等记录下来。
比如你在开发另外一个项目,别人请教你之前某个项目的问题的时候,不需要再登录页面各种点击找到页面等。
比如你开发测试过程中就已经把上线注意事项想好了,切回来准备上线事项时,就会花费更少的时间进入状态
测试时用到的SQL语句,用到的URL,页面截图等都记录好了,后面如果有问题直接中找到之前的参考,可以快速排查问题。
(2)开发时养成好的编程习惯。提取子函数,降低理解代码的复杂度。如图所示,如果只需要修改并发查询10次的功能直接看子函数即可,降低理解上下文的难度。另外容易困惑的地方加上注释,这样做其他功能的时候,切换到这里可以尽可能快的理解。
图2.3-1
另外可以学习 番茄工作法,专注30分钟,然后休息5分钟,然后再专注30分钟,...
图2.3-2
可以安装番茄工作法的软件,我看到有同事安装使用,值得借鉴。
2.4 算法差异
正如极客时间中《10x程序员工作法》结束语中所提到的一样。
算法的时间复杂度的差异,如插入排序的时间复杂度为O(n^2)而快速排序的平均情况下时间复杂度是O(nlognn),他们的本质差异在于,快速排序算法比较的次数更少。 插入排序每次循环只关注当前的目标循环之间没有联系,而快速排序在做不同的划分时,上一次的结果对下一次有帮助,因此它省下了不少比较的次数。 所谓的算法优化就是,尽可能利用已知的信息,少做不必要的事情。
因此当我们遇到问题的时候,尽可能的了解怎么去解决这一类问题,总结做事的规律,掌握排错的方法(《代码排错和避免错误的正确姿势》),而不是一次又一次的问一些类似的问题。
另外我想到一点,大家如果读过《剑指Offer》就会发现其实不同的算法时间复杂度不同,很多时候是不一样的思路。
因此方法是决定效果的重要因素。
每种学习方法,就像数学里的不同的函数,如一次函数、二次函数、指数等,增长的速率不一样。
每种学习方法,就像计算机中的算法,如快速排序,冒泡排序等等,时间复杂度很多是不一样。
由此我强烈推荐大家多总结和学习编程的技巧,学习排错和避免犯错的一些方法,而不是只着眼于解决眼前问题。
虽然天赋或许更重要,但是对于大多数人来说,天赋没法改变,我们可以学习好的方法,提高效率。
其实很多人学的不好,一方面是太浮躁,一方面是不懂方法,还有就是由于舒适区的原因导致不愿意尝试甚至排斥新的方法。
就像大多数用过IDEA的人都会认为IDEA比Eclipse颜值和插件都更高,可是新手从Eclipse换IDEA时都是有些抵触的。
之前接触过一个学生,她的字很烂,买了字帖练习了几个月,最后离开字帖还是变回原样。
问她知道什么原因吗?她的思想是大家都是这样做的啊,写的不好老师不都说买字帖练习吗?
我之前总结了一份英语字体书写建议,给了这个学生,她接近半年都没当回事,后面决心试一下,一两周字帖大变样。
其实很多人之前英语字体不好,只是随性书写,没有按照一定的章法去写,没有去总结怎样更审美,花费了多时间却没效果。
经常看到很多人在群里问问题,却很少人重视总结和实践排错、避免错误的方法。
这或许也是马太效应的一个重要原因,因此成功的人越来越成功,普通的人大多数也将普通下去。
恰恰是不想浪费时间去学更多的方法,导致每次遇到问题却浪费更多的时间在排错。
这就像很多人高中的时候,做错的题从来不看,做错的题放到错题集就躺在那里,没有抽取出共性,没有总结出规律,没有反复的去反思,没有意识到本质是对知识点掌握的不扎实,没有趁机掌握对应的知识点,导致同一的问题,第一次错过的第二次大概率还是错。
三、感悟
当学的多了以后,如果能够找到不同知识之间的共性,再学习相似的知识就会非常容易。
有些人担心Java如果不行了被替代了该怎么办?
其实学习是一种能力,理解需求的能力,排错的逻辑能力,专业的基础能力,文档能力等等,都可以迁移到其他的行业。
编程语言都是相通的,安卓代替了塞班,塞班那批人很多成为第一批转到安卓的人,赚的盆满钵满。
我们利用生活去帮助我们理解技术,反之亦可以用技术反向帮助我们思考工作和生活。
我们有时间可以多思考怎样利用编程知识来提高工作的效率,找到知识的共性,并能够活学活用,或许这就是学习知识的真正价值,即“学以致用”!
还是那句话,有时候恰恰是因为我们不想浪费时间,而浪费了更多的时间。
我们不愿意系统的看Spring技术文档,导致个别用法不会,到处查资料,导致出BUG。
我们不愿意,不知道,不主动了解Redis经典的书,导致面试的时候很多问题回答不对。
我们上下文切换太频繁,却不认为这是一个问题。
我们没有记录工作的内容,认为这是浪费时间,认为没必要,出了问题还需要花费很多时间去做一些重复的劳动。
我们写代码不认为可读性,很重要,后面修改起来非常痛苦。
我们一直在学习,以为花了时间了,感动了自己就很踏实,有时候找不对方法,这只是在弯路上而已。
最后推荐几本书《整理的艺术》共四本,里面推荐了很多整理的技巧,提高效率的技巧,对工作和生活很有帮助。
创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。 另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。 https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。