Contents
为了纪念刚刚出离的瓶颈期,我写了这篇博文。 同时也总结这一下这段时间的心态与所得。
引言
我目前的职业规划还是做 技术 为主。
做为一个 程序员 ,我觉得 技术 才是我们的立身之本。只有在技术上掌握到较高的层次,你才好围绕着技术拓展自己的其它能力。
当你的技术还没达到较高的层次之前,就相当于在打基础。那这个打基础的过程在我的理解里有点像上台阶。
当你走一段比较长的平台,遇到了一个台阶,就是遇到了你的瓶颈。你跨上去了,你就成长了一点,你又会走过一段比较长的平台。但是随后的台阶会越来越高,有人经历了几个台阶后只能原地踏步、有人只经历一两个台阶就另换职业,有人可能会越战越勇,不断得突破自己。
那我比较幸运,在我的 IT 职业生涯第二年就遇到了的第一个瓶颈期。
瓶颈期的状态
我是怎样察觉到自己处在瓶颈期的?
说到怎样察觉,我体会到的是:
不是突然遇到一件事就让我察觉到了自己处在瓶颈期。
而是在比较长的一段时间内,遇到很多的事情让你有以下几种感觉:
- 工作没有目标,没有动力,看不到未来
- 感觉自己活得好累,事业上平平淡淡,生活上没房没车
- 感觉自己在技术方面很难进步,反而有些退步
- 感觉自己不明白的东西太多,而自己基础又太薄弱
- ... ...
总之一句话:
感觉自己就是一个 loser
干啥啥不行,吃啥啥不剩。
我在瓶颈期的状态如何?
我是从医药行业跨到 IT 行业的。
我为什么要来到 IT 行业?
因为我热爱编程,觉得编程是件很神奇的事。
以编程作为自己的职业,是我的梦想。
当初我是怀着一腔热血进入 IT 行业的,冲劲十足,进步神速。只要是和计算机、编程相关的事,我都觉得很有意义,是个学习的机会。
但是经过差不多两年的时间,我发现自己很难进步了。
- 我目前的工作是以 Python 为主,所以就看了大量的目前市面流行的 Python 书籍。但是我发现那些书没啥好看的,基础的我都懂,高深的又比较理论化,感觉投影不到现实编程当中。
- 工作的内容也慢慢 Hold 不住了,以前只用写些小型的界面程序、辅助程序等等。现在面对着复杂的业务逻辑,复杂的业务处理流程,我不知道该怎么这才能比较好的实现了。
- 自己平时都有关注一些新技术、新的 Python 库,新的语言。然后就会花点时间学点皮毛,但总是无法深入。
- 不断接触和涌出的各种技术,让我感觉无所适从,难不成有一个我就学一个?学到死?
- 谈了恋爱,钱、房子、车子等等这些以前想都不想事情,在女朋友有意无意的提示之下,也觉得这些事成了当务之急。而现在自己,却一无所有。
- 看了大量道家的书、佛家的书以及这些圈子的人写的各类文章,让我整个人的理想和实现有了很大的矛盾。
总而言之:
整个人生没有了方向,不知道该怎么走,也没有什么动力走下去。
如何渡过瓶颈期
当我意识到自己处在一个瓶颈期时,第一个念头就是怎么出离这个令人迷茫而又不舒服状态。
我就思考我要怎么做。
什么是我的瓶颈?
我是一个非科班出身的程序员,基础的知识薄弱。
我是一个动态语言为专业的程序员,底层知识薄弱。
我只做过一些小型程序、软件,中型以及大型系统的设计及编程能力薄弱。
我大部分时间只是在熟悉业务,而对承载业务的各类协议、数据库、操作系统等目前硬通货了解不深入。
如何解决这些瓶颈?
想要有优质的生活,你需要有好的事业。
想要有好的事业,你需要有市场需求的鹤立鸡群的职业技能。
想要有过硬的职业技能,你需要能人所不能。
想要能人所不能,你需要了解技术的本质,一通百通。
在参考了网上一些前辈写的文章,我确定了我以后的两条主线:
- 先掌握计算的本质、再掌握计算机的本质
- 掌握目前主要的硬通货
掌握计算的本质
看完《The Little Schemer》、《How to Design Programs》、《structure and interpretation of computer programs》... ...
掌握 Scheme、Haskell、prolog。
以实现一门自己的高级语言解释器为一个里程碑。
后面的路暂时还未想到。
掌握目前主要的硬通货
掌握 HTTP 协议
一个 Web 框架的整个实现原理
以编写出一个自己的 Web 框架为里程碑
掌握 Python 实现
以实现一个简化版本的 tiny python 为里程碑
Linux 内核实现
以编写一个自己的小型操作系统里程碑
我目前的状态
我最近一段时间的心理相对于以前来说,平稳了许多。而且很明显得感觉到自己已经开始慢慢摆脱瓶颈期了。
怎么感觉到的?
很简单。我现在有了方向,有了动力,并且努力朝着这个方向前进。
我在哪些方面提高了?
递归
之前的理解
印象中的递归更多的是教科书内的汉诺塔之类的例子。
递归效率不高,递归层次深了更可能会栈溢出。
现在的理解
在看了《The Little Schemer》后,对递归有了更进一步的了解。具体的看 glob 标准库的学习 。
怎样读其他人的代码
之前的理解
刚开始学一门语言时,语法不是很熟悉,看别人代码
关注更多的是 作者写的是什么
看完别人的代码,感觉自己懂了,但是当你脱离作者的代码想自己实现时,还要时不时地看一下原作者的代码
现在的理解
但是当你熟悉一门语言后,你应该转换你的观点了,
应该更多的关注是 作者是怎么想的
你了解到了作者在写代码时的整个大脑活动,那作者的代码就内化成你自己的代码,同时,由于你本身处于局外人的身份,你还会发现作者的思路缺陷,能够写出更漂亮的代码
程序设计基本思想
之前的理解
单一职责、自顶向下、模块化、接口先行、自底向上 ... ...
只知道这些名词是啥意思,但是在代码设计及实现却没有有意识的按照这些思想去做。
现在的理解
自顶向下体现的是一种全局观,根据需求划分出多个功能模块、然后每个功能模块需要提供哪些接口
然后再自底向上挨个实现每个功能模块,当然在每个功能模块内部也同样可以复用以上逻辑
设计模式
之前的理解
以前有过一段做 GUI 程序的经历,在做 GUI 时,我觉得 GUI 这个领域算是面向对象的最佳实践之一。当时也是首次有意识地将设计模式应用到代码中。当然,一开始必然是生搬硬套。对着书,觉得这个设计模式有意思,好,看看程序里哪边可以使用上。
后来,又接触到了函数式编程的概念。网上很多文章将函数式编程和面向对象编程放在了对立面,然后将函数式编程捧得很高,将面向对象编程批得很挫。我也受到这种思想的荼毒,走得比较极端,开始厌恶使用面向对象编程,甚至拒绝使用 Python 中的 class 关键字定义类。
现在的理解
设计模式最重要的是什么?
设计模式最重要的是它的 SOLID 原则。
单一职责原则:The Single Presponsibility Principle
开放封闭原则:The Open Closed Principle
里氏替换原则:The Liskov Substitution Principle
接口分离原则:The Interface Segregation Principle
依赖倒置原则:The Dependency Inversion Principle
那些所谓的设计模式只是在一定的应该场景中这些原则的全部或者部分的映射。
class 定义一个类是提供了一种封装的手段,那么闭包也是。它们都是为了实现封装而提供的工具而已。