如何轻松的取得满意的收获
有没有感觉,自己非常努力了,但是却感觉自己什么都做不成,或者进展缓慢?
如何解决这个问题?
技术性说明
本文中,使用通用的词汇,目标、步骤,来表示我们所做的事情。其实,在不同的领域中,它们等价于不同的词语。为了使得我们更好的利用本文的方法,我们可以这样做定义。
| 领域 | 目标 | 步骤 |
|---|---|---|
| 软件开发 | 项目 | 功能或模块 |
| 游戏、运动 | 高水平 | 分段、水平区间 |
目标
目标太多
我觉得,人可以有梦想,有目标,但是,我发现,我有一个问题,就是我的目标太多了。舍弃哪个都不甘心。这就形成了一个问题,实现目标变得越来越困难。因为目标多了,分配到每个目标上面的时间就少了。
光游戏,我就有三个目标,一个是星际争霸2的大师,一个是王者荣耀的巅峰赛2000分,一个是国际象棋的2000分。不得不说,这里的任何一个都是很有难度的。但是,让我舍弃哪一个,我都觉得不甘心。不过,问题就是,如果不愿意舍弃的话,目标越来越多,负担越来越重。
说实话,我已经好久没打星际争霸2了,因为之前也打了很多年,从2012一直打到2016,也没有到大师。后来就是偶尔打一两个月。也没有太大进步。所以,星际争霸2,我算是基本上放弃了。然后,就是王者荣耀了。其实王者荣耀我是从2021年开始玩的,到现在可以说已经玩了2年多了。最高达到过巅峰赛1650分左右。已经非常不错了。我还是相对来说的一个新手。最后就是国际象棋。像国际象棋的话,其实我很少花时间在这个事情上。像这个月我重新捡起来这个游戏,也只花了不到10个小时在这个游戏上吧。这个已经算是我勤奋的时候了。这个和王者荣耀是完全不同的。王者荣耀我一个月花100个小时都是有可能的。但是国际象棋对我来说没有那么上瘾。不过,这是好事。我可以更加冷静的学习。实际上,这样的效率肯定是更高的。
可以想象,这些目标带给我多少工作量了。其实每个目标都是不小的成就。然后,当然就是,我又对很多编程语言感兴趣。这也想学,那也想学。虽然说,我已经熟悉的语言就不少了,C#,是我唯一精通的语言,然后,我比较熟悉的语言还有c/c++,以及python。然后,我想学习的语言,有rust,汇编语言还有javascript,当然,还有数据结构和算法。除了这些之外,还有工作本身,要做的项目,等等。
最近一段时间总是有这种感觉,一直很努力,却又总是感觉收获很少。我觉得,可以做这样一个改进。就是,所有游戏目标,同一年只能选择一个去玩。比如,这三个,星际争霸2,国际象棋和王者荣耀,同一年只能选择一个花时间去玩。这样,就可以避免又累又没有进展的情况了。
想要学习的东西,比如,编程语言,数据结构和算法,经济学,日语,这些,我觉得,可以做一个简单的限制,就是同一个月只能选一个去学。比如,这个月我可以分配10-20个小时给这些想要学习的东西。然后,这个月,就选一个,好好学一下。
另外的话,如果是自己做游戏,不找工作的话,也是一样的,最好不要同时做几个项目。同时只做一个项目要好多了。可以更快的进展,而不是两个项目都进展缓慢。如果有工作的话,就好好做好工作,就不需要用业余时间做项目了。
另外的话,其实我之前一直有一个想法,就是想写小说。实际上,这是我一直以来的梦想之一。之前也有尝试过几次,但是总是写了只有一两万字就放弃了。我觉得,这些都要舍弃。工作就要选好一个专业,好好的去做。又想做程序员,又想做小说家,这实际上是给自己没有必要的负担。选好一个然后认真去做就好了。
减少目标的思路
其实,正确的思路,并不是,我想要达到哪些目标。这些目标本身是不是有价值。舍弃是不是太可惜。
正确的思路,应该是,我一天最多可以利用12个小时,然后,一个月最多可以利用200小时左右(现实一点吧,不可能每天都努力12个小时)。我要想好,我想把这些时间花在哪里比较好,预期会有哪些收获。
只有这样才是正确的思路。
步骤
目标拆分
减少目标的同时,我们要学会,每一个目标,不要一步到位,而是拆分成几个步骤,然后一步一步的去做。
举个例子,比如,学习国际象棋的时候,我发现,国际象棋有好几件事情,都是需要做的。
- 战术(tactics)
- 位置(position)
- 开局(opening)
- 下棋
我们可以拿开局举例,其实国际象棋的开局是很多的,想要学好开局得花成百上千个小时。
但是,对于纯新手来说,学习开局意义不大,更加重要的是战术练习(应该差不多是中国象棋中的残局吧)。
所以,我们就可以先练习残局练习100个小时,熟练了之后,再去做其他的。
所以,新手可以按照这个顺序进行学习和练习:
- 100个小时的战术练习
- 学习基本的开局和位置原则
- 学习最简单的几个开局
- 下棋
- 学习:进一步战术练习、开局或位置,然后回到第4步
就这样,先学好战术,然后再知识,再学开局,再下棋,等下一段时间遇到瓶颈了再暂停下棋,学习一段时间。这样做是最轻松的。
千万不要一上来,就下棋,同时学习开局以及练习战术。这样只会感觉很累然后很没有成就感。
再举一个例子,对于一个新手,学习web前端开发,那么,有三个东西要学,html,css,javascript,然后,还有一个接一个的框架。如果一上来就做项目,所有东西同时学,会非常吃力。
我们把这些东西排列好,按照顺序学习,就可以了,等我们学完所有的,再做项目,这样是最轻松的。
顺序是这样的:
- html
- css
- javascript
- 框架
再举一个例子,如果一个人要开发一个游戏的话,其实有很多步骤:
- 开发游戏逻辑
- 制作游戏关卡等数据
- 美化界面和其他美术
- 测试游戏
- 宣传和发布游戏
其实这5步是可以同时做的。你可以一边写代码,一边做关卡,一边做美术,一边测试,一边宣传。但是这样会很累,而且容易感觉进展很慢。
更加轻松的方式,就是按照顺序去做。比如,第1步的时候,开发游戏逻辑的时候,就不着急制作100个关卡。制作100个关卡的时候,不要着急美化游戏内容。美化游戏内容的时候,不要着急测试。测试的时候,不要着急发布。
一步一步的去做,而不是同时做,会轻松许多。感觉进度会快很多。
我认为按照顺序做,不仅感觉轻松,进度快,实际上,进度确实会更快,当然,没有感觉的那么快。
目标拆分的思路
其实就是把我们的整体目标,拆分成几个步骤,然后一步一步的去做,也即是,先做完一步,再做另一步,而不是同时做,这样会感觉轻松很多。
步骤简化 - 聚焦
减少目标,拆分目标为步骤之后,实践中,我们仍然发现一个很大的问题。就是,一个步骤太复杂,太困难。需要花费大量的时间。
其实这里的原理和减少目标是类似的。只是应用在子步骤上,也就是,减少子步骤。
这里举几个应用的例子。
王者荣耀聚焦例子
其实王者荣耀就是一个聚焦很好的例子。同样是达成一个比如,巅峰赛2000分的目标。有两种选择,一种是,什么位置都玩,什么英雄都玩。没有固定。另一种选择是,只玩一个位置,然后,同一个赛季基本上主玩一个英雄。
其实王者以下是无所谓的。玩什么英雄都可以提升。但是到了巅峰赛之后,就需要对英雄有具体的理解了。包括,铭文出装、技能释放等基本的东西。这些东西都需要特别的去记忆和练习。出装也不是完全固定的。也要根据具体的情况改变。技能释放也要根据对方的英雄进行改变。
以我所使用的孙膑为例。比如,防御装,一般上会先出物抗的不祥征兆,但是,如果对面打野是法师,例如司马懿,诸葛亮的情况,就可以选择先出魔女。
3技能的释放,有时候是根据对面的英雄而有不同的方式。一般上,三技能都是团战触发的时候释放的,沉默对面一秒,可以瞬间拉开差距。但是,如果对面有重要的需要打断的技能,就需要特别针对。比如,马可波罗,钟馗的大招,是可以打断的。我们的3技能可以起到特别大的效果。所以,有时候可以选择保留三技能,等待对面释放这些技能。
2技能的释放,可以加速,回血。一般上,都是在会比较频繁的释放。但是,有时候需要注意特别保留。比如,遇到吕布的时候。吕布跳大的威胁是很大的。所以,打团的时候,有时候需要特别注意吕布有没有大。如果有的话,不要太轻易释放2技能。这样吕布跳大的时候可以给队友一个加速,让队友快速的跑出吕布的圈子。吕布的作用就很小了。
我之所以知道这些,不是我从网上的视频中看来的。而是我打了几百把孙膑,在实践中发现的东西。这些细节上的东西,都是很重要的,但是每个英雄都不同。所以,如果什么英雄都玩的话,总结出这些东西就会慢很多,甚至可能总结出来的东西很快就会忘记。而如果只是聚焦于一个英雄的话,就可以快速的提升水平。从分数上来讲,特别如此。一个1200的本地人,如果什么英雄都玩,恐怕提升到1500的水平需要1000把左右,但是,如果只玩一个英雄,那么,300把应该就差不多了。估计不超过三分之一的时间。
软件开发聚焦例子
另外,举一个软件开发的例子。
当我们把项目拆分成若干个功能或者系统(类比为本文中的步骤)之后。经常会出现一个新的问题。就是一个功能,其实可以做的非常全面,非常完整,也可以做的非常简单。而我们有时候,非常容易就把一个功能做的非常复杂和全面。
就以常见的用户管理系统举例。用户管理,其实就是,注册、登录这些东西。其实这个东西要做完整是非常复杂的。包括这些,登录的话,可以使用用户名密码登录,使用电子邮件密码登录,使用手机号码和密码登录,使用手机号码和验证码登录。
另外,登录可以做成2步验证。就是,用户名密码登录之后,还有一步是手机验证码或者一个动态码(例如,谷歌身份验证器)登录。
以前,还有一个安全问题的功能。就是,忘记密码之后,回答一些安全问题,就可以让你找回密码。比如,你最喜欢的食物是什么,或者,你的小学叫什么名字等。
登录还有一个功能,就是使用第三方账号登录。比如,谷歌登录、微信登录、如此等等。
这样又产生了一个新问题,就是同一个用户,使用用户名密码登录和第三方登录,两种方式登录同一个账号,需要把这些账号链接起来,合并为一个账号。
还有一个就是登录记录,以及可疑登录检测。
还有一个,就是登录的时候,提供的captcha。就是防止机器人进行登录操作的情况。
光是登录,就已经非常麻烦了。
然后,还要提供重置密码的功能。比如,发送验证码到电子邮件,让你重置密码。
当然,还要提供注册的功能。
可以想象,如果要开发一个网络游戏,但是还没有自己的用户系统的话。那么,光是这一块,就需要一个人花好几个月的时间去做。
如果只有一个开发者的话,那么,问题就大了。你可能花好几个月,什么游戏功能都没做,光是做了一个用户系统。
其实,在我们不知道我们会有多少用户的情况下,我们可以假定,我们做的东西用户不多,例如,只有几千人。那么,我们就可以只做最基本的功能。
就是登录只有一种,电子邮件+密码,如果是国内的话,那就是电话号码+密码。然后,一个密码重置功能,然后一个注册功能就行了。
没必要做第三方登录,账号链接,可疑行为检测,二步验证等等。这样做的话,2-3个星期应该差不多了。可以大大的节省开发时间。从几个月,变成几个星期,我们就有时间开发游戏功能了 :smile:
除了登录系统以外。很多系统和功能也有类似的情况。比如,构建和部署,我们可以使用复杂的功能,比如,jenkins,来做构建和部署。也可以写一个bash脚本,运行一下就构建和部署了。如果团队很大的话,使用jenkins肯定是正确的选择。但是,如果只有一个人,那么,其实维护jenkins网站(更不用说要学很多专用的知识)反而增加了很多工作量。一个简单的构建和部署脚本,往往更加高效。
web开发学习的例子
最近因为有做网站的功能。所以学习了一下web开发。
发现,web开发是一个无底洞。做前端和web服务器,有框架,以及一堆插件。然后,做api服务器,又有框架。然后,部署呢,又要docker。运行呢,又有kubenetes。
例如,如果你去想服务器性能优化的话。那么,就要纠结于如何提升运行效率,优化代码,使用速度快的库。
如果考虑负载平衡的话,又要学习,如何使用kubenetes、docker swarm等。
如果想要自动化部署的话,又要学习,jenkins、circle ci等。
更不要说,前端框架,vue以及react这两个前端框架本身就很复杂。有非常丰富的功能。
当然了,更不用说,最基本的html、css以及JavaScript了。而JavaScript这个东西本身,又是一个历史悠久的语言。语法变来变去。对于新手来说,确实又是一个非常复杂的东西。
所以说,web技术非常的丰富。我们要做的是,对于小团队、个人团队以及学习者来说,学习和使用其中的一个子集,可以大大的提升我们的进展的速度。
举个例子,css排版,有flexbox和grid两种方式,我们只用flexbox。css框架,有bootstrap,tailwind等等。两种完全不同的理念,只学一种即可。
自动部署以及负载平衡直接不要使用,除非你有百万用户量级再说。
服务器性能优化,稍微做一下就行了,除非你有百万用户量级,没有必要在这个无底洞上面花费时间。例如,我就花费了很多时间,去研究pypy(其实就是python的一个解释器),希望我开发的api服务器效率更高。
但是实际上,在不知道我们的服务有多少用户之前,提升效率其实作用不大。只有服务器资源紧张的时候,提升效率才是重要的。如果我们的应用或游戏以后实际上只有几千个用户,这些效率提升的考虑基本上是浪费时间。
另外,JavaScript历史悠久,有许多种写代码的方式。我们就学习其中的一种,最新的,最先进的写代码的方式就行了。然后只要知道这个就行了。我们又不是大公司,有一堆老代码。是吧。个人开发者或者小团队可以有意识的只是用这个语言的一个子集进行开发,大大的降低学习成本。实际上,只要不是什么历史悠久的公司,都没有必要知道,老的Javascript是什么方式。
至于,前端框架,Vue以及React,只要学习一个就好了。
然后,后端,有很多语言,比如,node.js,java,python等。只要学习一个就好了。每个语言又有很多框架,只要学习一个就好了。
然后部署的话,只要一个docker就行了。没有必要学什么负载平衡,kubenetes这些复杂的东西。
从这里的总结里面,我们可以节省很多学习的时间。特别是对于一个新手来说,要学这么多东西确实是负担太重了。通过聚焦到一个点,形成一个可行的技术栈,大大的减少了一个新手的学习负担。可以说,基本上,只要学习10%的东西就行了。
聚焦总结
我们可以把事情做的很复杂,也可以把事情做的很简单。
在软件开发中,把事情做的很复杂,往往是因为团队很大以及用户很多,不得不把事情做的更加完善、完美一些。
而对于小团队或者个人来说,甚至,有可能对于大型的团队来说,这些复杂度都是没有必要的。学会聚焦,只做必要的事情,可以大大的简化我们的工作。
效率提升 - 不要跳来跳去 (STUB)
总结
本文说明了,如果更加轻松的去做事,同时也能收获丰厚。
- 就是根据实际情况,控制自己的目标数量,舍弃或延缓一些没有时间去达成的目标。
- 就是把每个目标拆分成几个小的步骤,然后按照顺序一步一步的去做,而不是同时做,这样会感觉轻松很多。
- 不要把一个步骤搞的太复杂,要根据实际需要,简化步骤,只做必要部分,省略不必要的部分
大概就是这样了。good luck have fun! :smile:
主要修订记录
2023年9月6日 增加:步骤简化 - 聚焦部分