增长知行 https://hyl.me/ 大龙的回忆录,和大龙一起成长,增长知行 如何度过自己平淡无奇的青春 https://hyl.me/archives/90.html 2021-05-04T23:08:00+08:00 首先,纠正一个问题,平淡无奇是相对的。相对那些伟人,时代的引领者,普通人的青春确实平淡,但相对自己,相对自己周边的人,每个人的青春都是多彩的,充满激情的!1 目标目标必须有!小时候,我们会说自己的理想是当个科学家,宇航员,虽然理想已经远去,但人生的目标还是应该有。大部分人,人生80%的时间,都是处于迷茫的状态。人之所以迷茫,就是因为缺失了目标。一个目标,可以是专业技能的提升,可以是升职加薪,可以是一套房子,一辆豪车,一笔通向生活自由的存款.....目标无所谓高尚与庸俗,毕竟大家都只是普通人,但目标一定要有!有目标,才不会迷; 有目标,才会有动力; 有目标,才会有生命的活力!2 激情我不喜欢太丧的年轻人。那些人觉得人生没有意义,所有的努力最后都会随着生命的逝去,而成为泡影,但活着,经历更多彩的生活,本身就是一种意义!我们不用面对战争,温饱问题已经基本解决,相对来说,这是这个不错的时代。生于这个和平的时代,已经要幸运过很多人,那何必浪费了这么好的运气呢?生活需要激情,工作需要激情,人生也需要激情!有激情的人,会活得更开心,工作得更顺利,也会有更多的精彩和好运!3 耐心人的坚持,人的耐力,是被慢慢培养起来的。相比十年前,我觉得自己更有耐心了。刚出来工作的时候,做一件事情,学一样新的技术,都希望能够立马得到正面的反馈。随着经历的增加,年岁的增长,自己的耐心似乎越来越好,可以等待半年,一年,甚至更长的时间。如果你觉得自己平淡无奇,没有突出的智力,八面玲珑的情商,我觉得在年轻的时候,不断培养自己的耐心是一个不错的选择。假以时日,这份超长的耐心,会使你与众不同!4 惜时刚毕业或工作几年后,有不少人会陷入迷茫。这个其实是正常的状态,很多人都如此。而如何应对这种状态,决定了自己未来人生的走向。有人心在迷茫,人也在迷茫,不行动,把时间浪费在抖音,微博上,期待自己脑瓜一闪,就找到新的方向。以我多年的经验,越是这么做,人会越迷茫!人之所以迷茫是因为,对自己,对社会了解不足。所以,要么看书学习,增进对自己的了解;要么出去看看,增进对社会的了解!浪费时间是最不可取的!5 挫折问我过去十年,给我带来最大成长的是什么?我会说是 : 挫折!知识,方法都可以从书本上获得,但心态和经验更多来自实践!挫折,是最有价值的实践!我回顾自己过往的十年,几次飞跃式的成长,都来自最艰难的几个时期。可能你目前过得艰难,可能你目前面临的压力巨大,但同时也想想,渡过之后,你将可能获得巨大的成长!年轻时候的挫折,是一笔宝贵的人生财富!最后希望大家珍惜自己的青春时光,我虽然也不算老,还不到40岁,但我觉得人是真的会变老的!想当年打球的时候,只要不服输,硬撑着一口气,都可以跑起来,而现在是真的撑不起那最后一口气了。我想,随着年岁的增加,这种感觉会越加的明显吧!岁月无情,年轻就是最大的一笔财富,因为它蕴含着希望和无限的可能。希望大家在三十,四十,回望自己过往的十年,二十年的时候,都可以不留遗憾! 技术人怎么减弱成长过程中的痛苦? https://hyl.me/archives/88.html 2021-05-04T22:57:20+08:00 技术人的成长可以分为两类,一类是本能型成长(这里可能还要细分,一类是顺其自然的深挖,一类是自驱动学习),一类是应激型成长。一般来说,本能型成长的效率会比较高,但现实是,我们在多数情况下面临的都是应激型成长。一、本能型成长1、本能型成长,你可以理解为源于自己的意识、兴趣和愿望。小A主要负责后端系统的开发和测试工作。他这人好奇心比较重,喜欢在测试环境对每个功能都了解一下,搞清楚业务到底是怎样进行的。有次他发现某个功能运行起来特别慢(因为是跑脚本并不太影响线上业务,所以一直也没有人处理),一查代码发现这个功能在一个页面中进行了若干次 SQL 查询,其中一条 SQL 相当复杂,耗时足足有 2 秒。于是,他开始分析问题,为什么要写这么复杂的一个查询,最后这个查询展示出来的是什么结果,对应页面上是哪个位置。在一一搞清楚之后,他发现其实可以有更优的做法,将这个查询稳定地控制在 20 毫秒以内,实现指数级的性能提升。问题解决后,他并没有就此止步,而是继续摸索,搞清楚了数据库中 I/O、索引等可能影响性能的因素,从理论层面弄明白了问题的根源所在,而这样的经验是可以直接复制到之后的工作中去的。可以看到,小A做的事情跟他当时的职位或岗位职责并没有什么相关性。关于 SQL 的性能调优,正常来说是属于 DBA 的事情。遵循了他内心对这个事情的热情,然后一步步把事情做好,他的出发点并不是为了要达成 KPI 或得到技术成长,尽管结果确实是达到了。对于这类型的成长,就可以归类为本能型成长。本能型成长是最有效率的,过程也是最快乐的,主要有以下几方面的原因:1)你满足了自身的渴望,因为你想做,而且没有障碍,你做到了,所以你快乐。2)因为你是真的想要做好这件事,所以你会废寝忘食地投入,用尽一切办法,自然成功的可能性也会更高,过程也会更快。3)本能型成长可能带来意料之外的好处,可能因为一些良好的表现,获得升职加薪或者负责更核心的业务。2、自驱动学习,一般是你想要改变现状,渴望得到进步。感觉今天已经学习不下去了,可是还有好多东西要学啊,很焦虑;感觉这个问题怎么这么难,一直学不会,钻牛角尖把自己弄的筋疲力尽,很焦虑。因为是自己主动想要改变现状,所以不会像应激型成长那么痛苦,但是他的前提还是要改变现状,渴望得到进步,所以还是会有焦虑的情况产生。这种焦虑的产生一般是因为学习计划制定的不够长远或者不够合理或者拆分的不够细致导致的。感觉还有好多东西要学习,但是每个人的时间精力特别是注意力是有限的。想象一下如果系统升级的时候没有进度条的情况,是不是非常让人抓狂。只有做好规划才能按部就班,每天达成一个小目标,每天进步一点点,张弛有度才能更好的达成目标。制定长远计划之后并不是一成不变的,需要根据自己的实际情况和状态来做调整打磨,直到达到一个比较优化的状态。另外一定要多分享输出,要保持开放的心态,遇到难以解决的问题可以求助或者拿出来大家讨论,很多时候会事半功倍。比如咱们的go语言内部学习分享和读书会很多时候就能帮助解决类似问题,而且一群人一起学习会坚持的更久。正所谓人无远虑必有近忧,所以对这种本能型成长,只要做好长远合理的规划基本就能解决。二、应激型成长再来看应激型成长,简单来说就是当我们身处在某个环境中时,由于外部因素的变化,导致自身不得不进行成长,以适应这些变化。小B是一个服务端技术专家,可是他选择了和朋友创业。在公司里面,技术专家只需要关心如何通过自己的能力和经验把产品和业务实现就足够了。但是作为一个技术合伙人,除了要做好产品实现之外,还对很多其他技能有要求。马云说过,“一个人走得快,一群人走得远”,而技术合伙人很重要的一项能力就是搭建一个走得远的团队,其中就包含了对识人和用人两方面能力的要求。团队搭好之后,如何调节好团队氛围,保证成员的成长又是另外一个重要的问题。这些还都只是对内的技能要求,还有对外的比如公司层面的跨部门协作,或是面向业界和市场进行输出,又是另外一些必不可少的能力要求。这些一切的一切,都逼着小B进行升级,通过不同的方式去学习和提升自己所缺失的技能。于是小B就进入了应激型成长的状态,然而这个过程并没有本能型成长来得容易,原因有二:第一,这些要求来得有点突然,甚至让人有点措手不及,但在当时,他并没有可选择的余地,甚至这是一道或成长或灭亡的选择题;第二,应激型成长往往伴随着打破自己的舒适区,如果要成长,就需要打破自己作为技术专家的舒适区,走出去,做很多之前没有做过的事情。而这些事情并不是小B有经验的,甚至可能都不是他喜欢的。正因如此,应激型成长往往是一个痛苦的过程。然而,我们不得不面对的一个现实就是,越是痛苦,克服了之后成长越快,进步越大,所以应激型成长反而在个人职业生涯中扮演更为重要的角色。三、拒绝意外既然知道应激型成长的重要性和无可避免,我们是不是有办法来减轻这种痛苦,从而更好地面对它呢?正如前面所说,应激型成长痛苦的地方主要有两个:一个是在我们的预期之外,而且通常特别快;另外一个是要求我们打破自己的舒适区,做我们不擅长的事情。只要能够有效地应对这两点,是不是就可以让痛苦减轻?回到之前提到的小B的例子,显然,他在进入创业这个环境之前,对于创业的认知是严重不足的。而正因为认知的缺失,导致对情况的判断出现了差错,并且最终走向失败。这就跟生活在美洲大陆的巨型地懒一样,它们没有看懂智人背后的团队协作和对工具的使用,可能给它们带来的威胁。当然,在那个信息流通程度几乎为零的时代,地懒犯这种错误是无可厚非的。今天则完全不一样,在这样一个信息过载的社会里,我们信息缺失的绝大部分原因,肯定不会是因为无法获取信息。换句话说,我们应该尽可能地保持对信息的敏感度,并且通过对信息的整合和判断,提前做好准备,来免除“惊喜”带来的痛苦。比如轻课的很多伙伴要加入101项目组了,过去之前就已经知道了服务端的技术栈,这样可以提前学习和研究使用的语言和框架。已经过去一拨人之后,通过和他们的沟通交流,对整个101项目的了解就会更加多了起来,理解了整体的业务模式,对之后技术方案制定和系统的编写都会有比较大的帮助。四、简单总结一下本能型成长一般都是自驱的,一般情况下是很自然而然的发生的,有焦虑的情况一般是没有做好长远规划和任务拆解,人无远虑必有近忧,我们需要的是做好长远合理的规划。应激型成长则是不可控的,而且一般随着业务高速发展也是不可避免的,同时产生的痛苦和焦虑也是更大的。但是我们可以尽可能的开放,保持对信息的敏感,提前做好准备,不打无准备之仗,拒绝意外,这样才能够做到随需而变,才能够有更好的未来。 晋升评委总结的6条建议,希望对你有帮助 https://hyl.me/archives/86.html 2021-05-04T22:50:00+08:00 连续两天半小20场的晋升评审还是很耗体力和脑力的,不过在这个过程中自己也从技术角度去了解了很多兄弟事业部的业务,以及这些业务上使用的技术栈和实现,同时也算部分拉齐了自己部门和整体的水平线,总得来说花费这些时间还是很值得的,简单总结一下从评委角度希望技术伙伴如何展现自己。1、需要有技术架构的整体梳理和展现首先评委不是非常清楚你在做的是一个什么事情,有了整体架构的梳理和自己负责的工作可以更快的和你同频,同时也可以比较方便的展现自己所做事情的重要程度,同时也可以看出你对其他模块的熟悉和理解。全局观还是很重要的,这样才能和伙伴们打好配合。2、需要有自己在一些技术细节上的思考和展现首先一个方案要调研和对比行业内的实现,如果这块不是你做的,也要了解前因后果和选型的优劣势。技术细节上一定要讲的清楚明白,同时加进去自己当时的思考,如果有迭代演进就更好了。所以这块需要自己平时就多积累多总结,而不是做完一个项目没有复盘就直接进入下一个项目中了。3、自己所做的工作对整个业务有什么帮助和影响,要有数据支撑4、要知道自己做的系统的性能和稳定性指标如何评定3和4这个需要平时要多关注数据指标,研发侧的工作原则上都需要有数据指标来衡量。5、基础知识需要扎实,而且要活学活用。这个就不过多解释了。6、需要有业务的长远规划这个也是需要多去思考自己所做的东西是否能够满足用户的需求,是否有更好更优化的实现方式,可能由于时间和资源的原因有些东西还没有很好的实现,但是没有完成也需要你多去思考和规划。最后,晋升和学习一样,功夫要下在平时,与大家共勉。 职业生涯中克服了这两个思维误区结果会大不一样 https://hyl.me/archives/84.html 2021-05-04T22:43:34+08:00 今天有个前同事跟我聊,说他有个的选择上的迷茫,想听听我的意见。他说,他有两个团队和项目可以选择,不知道去哪个好。然后,我跟他聊了一个多小时,发现他在思维上存在两个误区。1、把多学些东西当成是目标如果是一个毕业的新人,说目标是多学东西,我觉得是没有问题的,但他已经30多岁了,如果目标还是多学东西就有问题。多学东西,可以促成自身的成长。如果是新人,因为未来无论走那条路,基本的能力是必备的,把多学东西当做目标,在初期是可以的。但如果你已经工作了5年以上,目标还是多学东西就有问题了。因为成长不是目标,成长是一个过程,是达成目标的手段。那什么才是目标?成为技术专家,成为业务专家,进入管理层。。。 这些才是目标。他因为一直没有搞清楚这个目标,陷入了成长的误区,以为只要多学东西,其他的一切,就会自然的到来。其实是错误的,有点学生思维。而且从他历史的选择来看,他跳过几个项目组,每个项目之间不是递进,升级的关系。而是平铺的关系。最后是他做了5个项目,然而他5个项目经验是相加的关系,不是相乘的关系,可见效率就低很多了。如果,他一开始就有明确的目标,就不会见到好项目就跳过去,而会根据自己的情况和目标去选择项目,而不是机械式的累加项目经验。2、等有能力了,再做中间过程中,我们还谈到,有一个新的项目,需要一个负责人,我说,你不考虑去试试?他说,我觉得自己的能力还不足,所以想先锻炼锻炼,再去。我当时一惊。我说,你这个想法不对。很多时候,不是先有了足够的能力,再去接那个项目,做那个事情的。很多时候,都是赶鸭子上架,能力的成长,是被逼出来的。我跟他举例,自己刚开始带团队的时候,也是完全没有管理经验的,要是等有经验再去做,那机会早过去了。还有,我们之前团队做RN相关的项目,那个负责的同学,开始也没有这方面的经验,也是被逼着,后面也做的很好。在实际的工作中,不知道你或者你周边有没有人陷入这两种思维的误区。如果有的话,及早意识到,并做修正,能少走不少的弯路。 程序员和码农的区别 https://hyl.me/archives/80.html 2021-05-04T22:28:33+08:00 知识星球里看到的一篇小问答,程序员和码农的区别,比较符合心境,分享给大家。程序员是有热情且具有创造力的人,跟律师,医生一样,能帮大家解决问题,另一方面,又能创造新奇好玩的东西,像个艺术家。码农,就是高级技术工种,依赖出卖技术体力获取金钱的回报。如果,你把自己定位为码农,那可能35岁就真的要不行了,你的体力输出完全拼不过年轻人。但如果你把自己定位为程序员,定位为用技术解决问题,用技术使得世界更加美好的艺术家,我相信,你是可以干到40岁,50岁,60岁,甚至一生的。所以,只要你对技术抱有热情,那就快乐,坚定地学习成长下去吧,你不必困扰于码农的困境,你只需要做你喜欢的技术。 2021年第15周的心得与反思 https://hyl.me/archives/week_15.html 2021-04-18T22:29:00+08:00 一、心得1、听了天明老师讲的自适应学习的理论知识,感觉自己之前头脑中的一些模糊的理念更加具象了,醍醐灌顶有些夸张,但是确实是串起来了头脑中的一些知识点。之前有读过樊登老师的一本书《陪孩子终身成长——养育是复杂体系》,养育孩子,绝不是“别人怎么做,我照做就行”这种简单粗暴的逻辑就能概括的。每个孩子都是独立的个体,都有自己的感受,都需要被尊重、被理解。当父母误以为教育孩子是简单体系,用机械化的模式来应对时,孩子的生命力就会被扼杀掉。所以很多时候家长的目的很简单,就是想要提分,虽然学费是家长埋单,但是作为想要成为受尊敬的教育机构的我们,一定要让孩子在复杂中成长,这样生命才会充满活力。好奇与求知是一个人生命中非常重要的事。养育孩子也是一件应该充满好奇心的事情,大人要用对待生命体的态度来陪伴孩子成长,而不是用对待机械体的方法来解决单个问题。这样,孩子才能健康地成长。2、本次万米跑经过内心的纠结,最后选了5km。因为平时跑步少,之前每次的万米确实都是全力以赴的跑下来了,而且成绩还行,可是跑一次受伤一次,成了恶性循环,每年也就只会跑这一次。这次量力而行,整个跑下来的感受非常好,左脚没那么疼(有旧伤引起的平足),脚底也没起泡,腿也还是自己的,所以周日在家又跑了个2km,可能是一个开始坚持跑步的契机😃。跑步、读书和学习这种都属于逆人性的,但是让用户特别是前期能够留下来确实是更重要的,一个好的习惯能够长久坚持下去,那这个习惯对他内心来说一定是愉悦的才可以(可能外人看着很苦,但是他一定是乐在其中的)。二、反思自己的go语言开发还停留在理论阶段,高估了go语言的工程能力,之前只是写一些小demo,产品需求理解的这么清楚的情况下,如果是PHP开发可能整体内部逻辑应该都已经开发完了。周六加班体验了一把脑子里都实现了,可是写出来就变形的尴尬🤦‍♂️。不过已经逐步在进入状态,实践自适应学习中。虽然代码写的不多,不过和兵兵在写逻辑的过程梳理了功能拆分,明确了内部逻辑的边界,对下周的工作开展还是有帮助的。整体拆分成关卡逻辑和车道学习逻辑;关卡逻辑包括:关卡判断和推题逻辑,基于题目维度;车道学习逻辑包括:车道变换、阶段复习、知识点内回溯,基于关卡维度;按照现有的全局放松逻辑,也是基于关卡维度的,所以基本内部功能拆分相对清晰合理,下周继续加油干。 一文带你掌握 go 语言中 type 的 5 种使用方法 https://hyl.me/archives/golang_type.html 2021-03-10T18:23:00+08:00 type是go语法里的重要而且常用的关键字,type绝不只是对应于C/C++中的typedef。搞清楚type的使用,就容易理解go语言中的核心概念struct、interface、函数等的使用。以下我用例子代码总结描述,请特别留意代码中的注释。1、定义结构体 package main import "fmt" //结构体定义 type person struct { name string //注意后面不能有逗号 age int } func main() { //结构体初始化 p := person{ name: "zzzx", //注意后面要加逗号 age: 18, //或者下面的}提到这儿来可以省略逗号 } //初始化字段不一定要全部指定,比如下面也是可以的,name默认取长度为0的空字符串 // p := person{ // age: 18, // } fmt.Println(p.name) }2、类型等价定义,相当于类型重命名type name stringname 类型与 string 等价例子: package main import "fmt" type name string func main() { var myname name = "zzzx" //其实就是字符串类型 l := []byte(myname) //字符串转字节数组 fmt.Println(len(l)) //字节长度 }不过,要注意的是,type绝不只是用于定义一系列的别名。还可以针对新类型定义方法。上面的name类型可以像下面这样定义方法: package main import "fmt" type name string func (n name) len() int { return len(n) } func main() { var myname name = "zzzx" //其实就是字符串类型 l := []byte(myname) //字符串转字节数组 fmt.Println(len(l)) //字节长度 fmt.Println(myname.len()) //调用对象的方法 }3、结构体内嵌匿名成员 package main import "fmt" //结构体内嵌匿名成员定义 type person struct { string //直接写类型,匿名 age int } func main() { //结构体匿名成员初始化 p := person{string: "zzzx", age: 18} //可以省略部分字段,如:person{string: "zzzx"}。也可以这样省略字段名:person{“zzzx”, 18},但必须写全了,不可以省略部分字段 //结构体匿名成员访问 fmt.Println(p.string) //注意不能用强制类型转换(类型断言):p.(string) }以下是只有单个匿名成员的例子。 package main import "fmt" //结构体内嵌匿名成员定义 type person struct { string } func main() { //结构体匿名成员初始化 p := person{string: "zzzx"} //也可这样:person{"taozs"} //结构体匿名成员访问 fmt.Println(p.string) //注意不能用强制类型转换(类型断言):p.(string) }4、定义接口类型 package main import ( "fmt" ) //接口定义 type Personer interface { Run() Name() string } //实现接口,注意实现接口的不一定只是结构体,也可以是函数对象,参见下面第5条 type person struct { name string age int } func (person) Run() { fmt.Println("running...") } //接收参数person不可以是指针类型,否则不认为是实现了接口 func (p person) Name() string { return p.name } func main() { //接口类型的变量定义 var p Personer fmt.Println(p) //值<nil> //实例化结构体,并赋值给interface p = person{"zzzx", 18} //或者:&person{"taozs", 18} p.Run() fmt.Println(p.Name()) var p2 person = p.(person) //类型断言,接口类型断言到具体类型 fmt.Println(p2.age) }另外,类型断言返回值也可以有第二个bool值,表示断言是否成功,如下: if p2, ok := p.(person); ok { //断言成功ok值为true fmt.Println(ok) fmt.Println(p2.age) }5、定义函数类型以下是定义一个函数类型handler type handler func(name string) int针对这个函数类型可以再定义方法,如: func (h handler) add(name string) int { return h(name) + 10 }下面让我们详细看一下例子,其中涉及了函数、函数的方法、结构体方法、接口的使用。 package main import ( "fmt" ) //定义接口 type adder interface { add(string) int } //定义函数类型 type handler func(name string) int //实现函数类型方法 func (h handler) add(name string) int { return h(name) + 10 } //函数参数类型接受实现了adder接口的对象(函数或结构体) func process(a adder) { fmt.Println("process:", a.add("zzzx")) } //另一个函数定义 func doubler(name string) int { return len(name) * 2 } //非函数类型 type myint int //实现了adder接口 func (i myint) add(name string) int { return len(name) + int(i) } func main() { //注意要成为函数对象必须显式定义handler类型 var my handler = func(name string) int { return len(name) } //以下是函数或函数方法的调用 fmt.Println(my("zzzx")) //调用函数 fmt.Println(my.add("zzzx")) //调用函数对象的方法 fmt.Println(handler(doubler).add("zzzx")) //doubler函数显式转换成handler函数对象然后调用对象的add方法 //以下是针对接口adder的调用 process(my) //process函数需要adder接口类型参数 process(handler(doubler)) //因为process接受的参数类型是handler,所以这儿要强制转换 process(myint(8)) //实现adder接口不仅可以是函数也可以是结构体 } 「转」0 基础如何开始入门学习 Go 语言 https://hyl.me/archives/golang_0.html 2021-03-10T17:48:11+08:00 1. 你需要遵循怎样的学习路径来学习 Go 语言?我们发现,订阅本专栏的同学们都在非常积极的学习和讨论,这让我们非常欣慰,并且和你一样干劲十足。不过,我在留言中发现,大家的基础好像都不太一样,大致可以分为这么几类。零基础的同学:可能正准备入行或者刚刚对编程感兴趣,可以熟练操作电脑,但是对计算机、操作系统以及网络方面的知识不太了解。无编程经验或者编程经验较少的同学:可能正在从事其他的技术相关工作,也许可以熟练编写脚本,但是对程序设计的通用知识和技巧还不太了解。有其他语言编程经验的同学:可能已成为程序员或软件工程师,可以用其他的编程语言熟练编写程序,但是对 Go 语言还不太了解。有一定 Go 语言编程经验的同学:已有 Go 语言编程基础,写过一些 Go 语言程序,但是急需进阶却看不清途径。基于以上分类,我为大家制定了一份 Go 语言学习路径。不论你属于上面的哪一类,都可以按照此路径去学习深造。具体请看下面的思维导图。(长按保存大图)2. 学习前,你需要有哪些基础知识储备?在这个专栏里,我会假设你有一定的计算机基础,比如,知道操作系统是什么、环境变量怎么设置、命令行怎样使用,等等。另外,我还会假定你具备一点点编程知识,比如,知道程序是什么、程序通常会以怎样的形式存在,以及程序与操作系统和计算机有哪些关系,等等。对了,还有在这个早已成熟的移动互联网时代,想学编程的你,一定也应该知道那些最最基本的网络知识。我在本专栏里只会讨论 Go 语言的代码和程序,而不会提及太多计算机体系结构或软件工程方面的事情。所以你即使没有专门学过计算机系统或者软件工程也没有关系,我会尽量连带讲一些必要的基础概念和知识。从 2018 年开始,随着 Google 逐渐重回中国,Go 语言的官方网站在 Google 中国的域名下也有了镜像,毕竟中国是 Go 语言爱好者最多的国家,同时也是 Go 语言使用最广泛的一片土地。如果你在国内,可以敲入这个网址来访问 Go 语言的官网。这个专栏专注于 Go 语言的核心知识,因此我并不会深入说明所有关于语法和命令的细枝末节。如果你想去全面了解 Go 语言的所有语法,那么可以去 Go 语言官网的语言规范页面仔细查阅。当然了,这里的语言规范是全英文的,如果你想看汉化的内容也是有选择的,我记得先后有几拨国内的 Go 语言爱好者自发组织翻译过。不过我都没有仔细看过,不知道质量如何,所以在这里就不特别推荐了。对于从事计算机和软件开发相关工作的同学,我强烈建议你们要有意地训练快速阅读英文文档的能力,不论是否借助字典和翻译工具。不过,如果你想专门学习一下 Go 命令方面的知识和技巧,那么我推荐你看看我之前写的免费开源教程《Go 命令教程》。这份教程的内容虽然稍显陈旧,但是帮助你学会使用 Go 语言自带的常用命令和工具肯定是没问题的。好了,其实即使你是个编程小白也不用过于担心,我们会一起帮助你的。至于我刚刚说的 Go 语言规范和 Go 命令教程,你也可以在学习本专栏的过程中根据实际需要去有针对性的阅读。3. 这里有一份基础知识列表,请查收如果你阅读本专栏的第一个模块时感觉有些吃力,那可能是你还没有熟悉 Go 语言的一些基础概念和知识。我为你精心制作了一张 Go 语言基础知识的导图,里面几乎包含了入门 Go 语言所需的所有知识点。(长按保存大图)有了这些,你是否已经感觉学习本专栏会更加轻松了呢?总之,教程、资料和助推就交给我和极客时间的编辑、运营们来共同负责。而你需要做的,就是保存好这一份对 Go 语言学习的决心,你可以自己去尝试整理一份 Go 语言的学习笔记,遇见不懂的地方,你也可以在文章下面留言,我们一起讨论。 努力读书,做时间的朋友 https://hyl.me/archives/read_book.html 2021-01-17T22:51:53+08:00 读书分两种,一种是读“有用之书”,一种是读“无用之书”。我们研发读书小组里面大家所读的书基本也是一半一半。“有用之书”就像各类专业课程,读完了就要在当下立刻实践,光看不用,基本就算是白学了;“无用之书”并不是真的无用,它们一般很难即时生效,但长期看来,会对你的人生造成巨大影响,比如人生感悟类内容、哲学、艺术、高等数学,等等。其实大学时的计算机专业教材,也属于“无用之书”,比如网络原理、计算机组成原理等。虽然对于许多伙伴来说,教材不具备短时的实操意义,但认真体会后,就可能收获更高的长期价值。因为从架构的角度看,这些内容更稳定,更经得起时间的考验 —— 教材之所以能成为教材,是有原因的。整体来看,所谓“有用之书”,如果不能实践,就等于无用;对于“无用之书”,如果有时间的时候不学习,事到临头时,也很难“抱佛脚”。所以我们既要学习可以实践的管理和专业技术内容,也有需要学习长期消化的认知内容。比如实践上体会一下「异常设计」,从明天开始,将所有模块的状态码都管理起来,提高代码的整体水平。同时,坚持长期主义:持续关注“无用之书”,许多经典内容是常读常新,好书需要反复读,很多认知是只有自己经历过了,才能有更深的体会。在实践时,我们需要“做时间的朋友”。你不亏待时间,时间就不会亏待你。找好方向,选择“有用之书”,立刻去做;选择“无用之书”,长期去做。一个月、一年不见效,怎么办?坚持去做。念念不忘,必有回响。当然努力的同时,也要注意休息,关注身体情况。有很多人,就是在事业蒸蒸日上的时期,突然查出了身体或心理上的问题,导致个人情况、家庭情况急转直下(有感于明天要去陪护妹妹的手术)。我们一定要想办法更聪明、更高效地工作。同时心情真的非常重要,一定要保持乐观。另外,身体在出问题前,一定会给你“信号”,不要忽视它。要多多学习健康知识,人总是会为自己的无知买单。最后希望大家能持续学习,学以致用,终身成长。遇见更好的自己! 自媒体写作有哪些黄金黄金模板? https://hyl.me/archives/money_diary-1-16-2.html 2021-01-16T22:58:00+08:00 转自:徐宿今天周末,分享给大家我整理的一些内容生产小纸条最有效的三种写作模板:1.总分总。分用数字排列。(数字排列的好处是即便你内容逻辑不清晰,只要有12345数字出现,读者也会感觉你清晰。数字排列的第二个好处是避免豆腐块式内容,让读者容易阅读。第三个好处是有利于梳理自己的逻辑,长期练习塑造自己的逻辑能力。)2.提问+回答+深化问题+再回答3.反面论证+正面论证最有效的三种开场模板:1.直接提出问题。(例:为什么西瓜是红色的?)2.直接用一个金句。(例:人不可以被改变,只能被天启。)3.对这个世界的事物进行归纳总结。(例:男人和女人只有三件事,钱权性。)最有效的三种结束模板:1.强化主题。(参考上面第二条。例:狗改不了吃屎,这是基因决定的。)深化观念。2.升华主题。(参考上面第三条。例:只要我们还是高级动物,对异性的生理和精神欲望永远不会消失。扩展观念。)3.引人深思。(结合第一和第二点,提出疑问引导互动。)爆款内容的三个制造原则:1.内容原则:内容一定要有价值。2.选题原则:精准化,和自己的定位尽可能贴合的同时和人性关注的那些点贴合,最好是多参与热点和多用名人来做题材。(避免政治内容和负面事件)3.切入角度:内容深度和启发性。(注意一件事一定有对立面,大众讲的话你不要去讲,制造人群冲突,最好语出惊人,极端。)五大百试百灵的选题方向:1.帮你闭坑2.帮你赚钱3.帮你提升逼格(变白变美变漂亮,让别人羡慕你)4.热点事件5.正能量或者厚黑学,能让人认清人性的光辉与黑暗内容里最好要包含:爽点(让人看着爽)、痛点(让人看了难受)、痒点(让人看了羡慕)内容运营的三个核心习惯1.寻找对标账户进行全面模仿。(不要自命清高,不要自作聪明,模仿也不是抄袭,而且借鉴人家的选题和套路框架。学习别人好的地方,收纳到自己的知识体系形成自己的品牌风格。)2.不断测试新话题。(不要安居一隅,在一个细分领域有了知名度继续埋头扩展内容边界,不断测试新话题新题材的好处在于:可以扩展自己的内容边界、可以扩大自己将来的商业化边界、可以扩展粉丝范围边界)3.语言方式和语言风格尽量接地气。(心有阳春白雪、口唱下里巴人,才能火。互联网不需要那么多说文言文的聪明人,把一个简单的道理讲高深是傻比,把一个高深的道理讲简单是牛比。)记住这句话:心有阳春白雪,口唱下里巴人。别想着走捷径,老老实实真诚给人家提供服务和价值,把人当人才配得到人的尊重,把人当傻子的,人也会把你当傻子,这个世界牛逼的人那么多,我们要认清我们是普通人。日拱一卒。