前言
本文来源于我的知识星球 "码农翻身" 的一个讨论帖子, 编程新手面对新的技术和项目, 如何学习, 如何快速提高个人开发能力? 抓狂的观点很有意思, 我建议他扩展了一下, 写成了这篇文章.
说服自己
拿我自己这一年的工作经历来说吧.
首先, 说服自己很重要, 什么叫说服自己呢, 就是一定要先把自己 "忽悠" 了, 让自己觉得现在做的事情非常的牛 x.
去年这个时候, 我也是刚毕业进公司, 上来就要搞一个之前从没有接触过的技术, 怎么办?
首先, 开始疯狂暗示自己, 这个项目很牛 x --- 大名鼎鼎 Erlang 平台, 号称可以写出十几年不用停机, 超高可用性的项目, 同时搭配吸取了 Ruby on Rails 精髓的 Elixir/Phoenix 开发框架, 开发速度据说是 Java 的 20 倍. 如此牛逼的技术, 学起来还不得偷着乐?
然后捣鼓开发环境吧, 语言太新, 没有成熟 IDE, 正好可以学学多年来一直想学的 Emacs --- 这可是号称神之编辑器, 号称伪装成编辑器的操作系统, 号称无所不能.
硬着头皮学, 一开始保存文件快捷键都要想一下怎么按, 把快捷键列表放在屏幕另一边, 一边看一边写, 竟然也能慢慢上手了.
然后项目跑起来, 学习语言, 理解核心要点, 开始写代码, 写项目 --- 从一开始写爬虫, 到研究如何打包项目, 热部署, 再到代码结构的设计优化 ...
甚至横向发展: 前端, 交互设计, SEO 都开始涉及. 慢慢的也能理解更深层次的东西了, 非常有成就感.
但是还不能满足, 能不能更好? 学习一下别的大牛是怎么做的? 都用的什么? 最新的开源项目用的什么技术? 学过来!
于是埋头研究, 把公司老旧技术替换成更好的新技术, GraphQL, 持续集成 / 持续部署 (CI/CD) ...
同时自己也搞点个人爱好, 比如给自己博客用上公司还不敢用的更加激进的新技术, 折腾一下 ArchLinux, 尝试自己搭建一个代理服务, 等等等等 ...
这样既能提升自己的水平, 又给公司创造了价值, 这样带着荣耀感去学, 怎么会觉得枯燥?
总之,"自我催眠", 认为自己做的事情很牛 x, 这样做起来才会有激情. 不然如果自己都觉得无聊, 一看见就烦, 那样能做好才奇怪.
内功
貌似学了这么多东西, 如果仅仅只能学到点新技术的用法, 能行么? 新技术日新月异, 瞎追是追不上的. 这就又回到老掉牙的话题了, 内功.
真正的聪明人聪明在思考问题的方式和你不一样. 聪明人有聪明人的思路, 而你想不到这个思路. 但要知道大部分人并不是聪明人, 所以也不要自卑.
扯远了, 再说内功. 为什么有的人学知识特别快? 可能并不是因为他有多聪明, 而是他内功扎实. 也就是对计算机的知识体系有一定程度上的理解.
比如在你懂了计算机网络之后, 就可以很快理解 RESTAPI,GraphQL,RPC 之间的异同, 也可以明白即时通讯协议 XMPP,MQTT 的优劣.
比如你了解 Lambda 演算, 编译原理, 形式语言, 自动机, 也就能理解一个语言为什么要这么设计语法, 为什么不能这么写.
比如你懂了数据结构, 你就能理解数据库, 搜索引擎中的细节原理.
这些知识并没有被什么邪恶组织封锁, 只要你想学, 网络上有大把的资源供你所学.
所以你眼中的聪明人真的是天才么? 不排除真的有天才, 但我想更多的是普通人, 只不过他学的稍微比你多一点, 知识体系比你更系统一点罢了.
所以只要你愿意学, 愿意思考, 愿意动脑子, 愿意较真, 愿意折腾, 也一定能成为别人眼中的聪明人.
道理我都懂, 但是到底要怎么做?
技术是复杂的, 而且每个人都有自己的学习习惯, 所以具体例子可能并不适用于所有人.
所以到底怎么做才能快速提高开发能力?
别急, 先讲两个故事.
利其器
一开始学校老师让你用纯文本编辑器, 不让用 IDE, 所以你就选则了比较流行的 Notepad++.
这是第一步, 先上手. 第二步, 在用的过程中寻找问题, 并解决问题.
比如, 经常因为标点符号打错而不能通过编译, 怎么办, 首先老师不让用 IDE 的原因之一就是让你认识到这些错误, 养成一种严谨的习惯.
那就打字之前小心严谨一点. 但是就算你非常严谨, 难免也有笔误的时候, 这个时候 Eclipse 登场了, 问题解决.
然后循环这个过程 --- 遇到新的问题, 解决问题.
比如有些代码片段记不住怎么办, 用自动补全. 变量改名方法结构调整的时候非常麻烦怎么办, 用 IDE 的重构功能, 等等.
其中解决问题的时候也会遇到问题, 比如怎么才能找到问题的解决办法呢? 一开始总是黑暗的, 这个时候可以求助他人, 比如现在有人告诉你, 搜索引擎是个好东西, 于是你知道可以用搜索引擎.
搜索引擎搜索不到怎么办? 这个时候就发挥作为人类的能力, 也就是结合和运用之前的经验的能力, 怎么办? 你现在只会用搜索引擎, 那只好在搜索引擎里搜索 "如何使用搜索引擎"... 结果还真搜到几篇有用的内容, 一看都是来自某某公众号的文章, 果断收藏.
发散思维之后还要收回来, 得到了搜索引擎使用秘籍之后要投入使用啊, 比如把某搜索引擎换成更好的搜索引擎, 把整句分割成关键字来查询, 最终你成功搜到了想要的结果. 同时, 积累了数个收藏夹.
下次再遇到问题的时候, 你又可以站在之前的经验上, 继续提高自己.
这样你就满足了吗? 虽然你解决了自己遇到的问题, 但是有没有可能另一种解决方式更完美呢?
所以继续发动人类能力, 于是你从你同学口中得知一种叫 IDEA 的东西, 又从搜索引擎上得知 IDEA 的优点, 又在之前收藏的论坛里发现了一篇 IDEA 的教程, 再结合自己 Eclipse 的使用经验, 你成功的上手了 IDEA. 这就是人类的能力, 可以结合运用之前得到的经验的能力, 而不是只能零散的使用.
你甚至把这个过程总结成一篇文章, 得到了许多膜拜, 也得到了许多批评建议, 不仅能收获了, 还能输出了.
最后, 追求永无止境, 能不能更好? 更舒适的字体, 更快的快捷键, 更强的代码模板 ... 总之, 就像剑客对其兵刃的喜爱一样, 投入精力不断打磨, 总是有回报的.
重构
拿着锤子不会锤钉子也不行啊. 工具并不能直接提高你的编程水平, 怎么办?
继续发动人类天赋技能, 之前你已经学到了遇到问题解决问题的能力, 那写代码有什么问题呢?
首先第一步还是先搞起来再说, 于是你花了三天时间写了一个 "高达" 80 行的程序. 写完之后觉得自己好牛 x 啊, 厉害的不得了.
冷静下来, 这样够了么? 不够, 因为代码中有三段都是重复的, 仅仅只有一点区别, 如果以后需要改动, 那就需要改动三处代码, 这样不行.
于是你花了两个小时把那些代码改写成一些函数, 使用之前学到的 IDE 重构功能, 消除了重复代码, 现在只剩下 40 行了. 写完之后感觉已经超神了, 怎么会有这么聪明的人?
冷静, 这样还不够, 虽然提取了出来, 但是方法名不能体现出功能, 而且可读性太差. 如果过两天来看完全不知写的啥.
于是你整理代码结构, 增加注释, 代码变得赏心悦目起来. 写完之后感觉精神振奋, 抬头一看, 天已经黑了, 嗯, 晚上能吃三个馒头.
冷静, 这些代码有没有值得总结的通用逻辑? 下次如果遇到类似问题能不能直接写出最后一步的代码而不是再这么重构一遍?
于是你认真分析, 总结出一个非常通用的逻辑, 什么时候可以用, 什么时候不适用. 写完长舒一口气, 晚上能睡个好觉了.
这么晚了只能吃夜宵了, 路上你想, 我这个东西这么厉害, 怎么能忘了出去炫耀一下? 马上打开手机, 正准备发帖, 突然想到, 聪明人大有人在, 是不是已经被捷足先登了?
于是你利用自己之前积累的丰富的搜索引擎使用姿势, 快速搜索到原来早就有人总结了出来, 还出了书, 称之为设计模式. 不禁出了一身冷汗, 这要是真出去得瑟了还不得被笑话, 幸好搜了一下.
吃完饭回来, 翻开设计模式, 哦, 原来别人是这么总结的, 大同小异. 设计模式算是理解了, 今天是太晚了, 只能以后再多加练习.
一星期后, 你发现有人在抱怨设计模式好难学啊, 背也背不会, 用也不会用, 根本无从下手. 于是给他耐心讲解一二, 那人发出感叹,"大神啊, 你怎么这么聪明."
你一时语塞 ... 真的是我聪明么?
总结
仅仅只是两个故事么?
其实, 开发能力的提升都像这两个故事中说的那样.
如何写出高质高效的代码? 并不是一蹴而就, 同样需要先按以往经验写出初版, 然后提取, 抽象, 最后归纳总结, 甚至开源分享. 为下一次更好更快的开发做好准备.
所以并不是按照某种经验照做就可以快速提升个人能力了, 而是需要按照一定的节奏, 站在之前的基础上, 不断自我升级, 迭代, 优化, 开发水平和速度才能稳步提高.
那到底是什么节奏呢? 各位都是程序猿了, 那就总结的程序一点:
遇到问题
解决问题
若解决途中再次遇到问题, 则解决子问提
能不能更好?
同时, 说服自己非常重要, 自信, 但不能自满, 要在觉得自己很牛 x 的情况下虚心前进, 这样有动力又走的远.
这一点儿也不矛盾.虽知大海的深邃, 但仍为捡到贝壳而欢呼.这是我非常喜欢的一句话, 作为结尾.
来源: http://zhuanlan.51cto.com/art/201806/575756.htm