资深的程序员有丰富的项目经验。但是大多数人没有注意到的是,新手程序员也有自身很强的优势,新手所具有的优势是有充足的数据,跟丰富的项目模板,比如github
。因此我们可以通过模仿资深程序员的工作习惯,或者是在既有的代码项目上进行模仿,通过了解代码项目的实施流程,对其实施细节的拆解再重新组合,从而达到学习编程和工作流的目的。要知道,模仿才是最好的学习!这也是后发者的优势。背后的逻辑是,你不可能等到了解了所有的知识以后再去工作,不可能等到参悟了生活的道理以后再去生活。
很多人没有注意到的一个事情就是:
当今时代我们已经从先发现因果再去解决问题,已经转向
仅发现事情的相关性就足够解决问题
的这样一个快速迭代的时代。
举个例子,包括谷歌搜索引擎用户的搜索关键词,进行统计排序,也是利用暴力算法去通过统计规律发现事情的相关性。如果我们还是采取以前的思考方式和做事方式的话,会严重落后进步的节奏。
一、案例分析法学习编程
先做项目,或者说先找一个项目做
。你甚至都可以不用找那些完全能看懂的github上面的项目代码,因为完全能看懂的代码就没有学习的意义了。
1.1 借鉴并模仿别人写得好的代码
比如我最近就在做一个电影推荐的项目和一个金融风控的项目,恰好同一个集中训练营的很多学员都是程序员,我把他们的作业都浏览了一遍,看了下哪些是写得好的,用了什么新的方法来调试,显示运行进程等等,用了jupyter notebook哪些插件和工具。我对于不懂的部分或者代码我都会认真把它拆解,然后到谷歌当中进行搜索,获取相应的背景知识。最后再将这些知识重组一遍,把整个代码流程完全过一遍之后,我才真正掌握了这一部分的,并且我认真观察他们代码书写风格,接收他们写得好的一些处理方式,以及代码的一些逻辑,从而优化我自己的代码书写风格。
1.2 对案例分解代码并学习的实施流程
以我最近做的一个电影推荐项目为例子。
以下是github上面的代码部分。
1. 分解
在这个项目当中,虽然它有很多段代码,但是实际上只用分成三个部分。第一部分是电影推荐系统,第二个是将电影推荐系统通过flask的web框架封装为app,第三部分是将app进行一个服务器启动。
于是分解后就得到如下图所示的部分,这样一下子就简单明了。
2. 调试
对一些实施细节部分不懂的,可以去网上查一些相关资料,并且抽取相关的部分代码出来调试,一点一点去弄懂。这个过程可以考虑用滴答清单去分解步骤,每次只完成下一步行动,完成当前行动,再完成下一个行动。
3. 重组
回过头来,通过随手画图,流程图,思维导图等方式去充分理解整个流程,把之前的细节重新串联起来去从更宏观的角度上去理解整个项目是怎么实施下来的。
以下是我在学习如何将自己的推荐系统的一些参数post到flask框架上的一些学习,我之前并没有接触过web的一些内容,于是我画了一些简易图来帮助理解。
不求多只求精。
你甚至这几个月只需要去认真钻研好这个项目就够了。
二、学习编程到底是在学什么
2.1 学习解决问题
关键词:大道至简
。
很多人以为学习编程,其实只是在学习一个编程语言的语法结构,逻辑以及一些常见的函数和用法。但对于我来说,我认为,编程并不会是一个很特殊的东西,学习编程跟学习其他任何东西在本质上是一样的,都是在解决一个问题,只不过用的手段不一样而已,所以在很多时候拼的是思维,也就是你一开始的方向,解决问题的方法有没有找对。
所以我认为,学习编程,有两方面更应该掌握,一个是做项目过程中,从无到有整个过程的合理流程,写代码的优良习惯,优良的组织的方式;第二个是另外一个就是对实际场景的背景了解,解决实际场景当中的思路和方法。
2.2 学习真实工作场景下代码的应用
在正式工作当中的编程工作流以及如何组织代码,是十分有重要的。举个例子,在真实工作当中。都是会把很多复杂代码写成写成类和包的形式,这样子十分方便重复调用。下一次要用的时候,甚至不懂编程的人,他都可以直接通过调用你写好的这个API就可以直接得出相应的结果,而不用理解中间到底经过什么样的一个复杂过程,也不用理解你的代码逻辑。跟你直接用家里的洗衣机,把脏衣服放到洗衣机里面,按下按钮,之后就可以得到干净的衣服。你不用知道洗衣机设计原理,电路构造,离心力的计算公式,这些都已经封装好了。
往往这些过程都是十分复杂的,但你要把它最终变成一个非常简单,容易调用的傻瓜式工作,对我来说,这些在教程当中是不可能学习到的,你得通过不断的模仿别人的优秀习惯,不断地总结,形成自己的风格和高效率工作方式。
2.3 多了解业务,问一些傻问题
除了编程这种专业性的知识以外,我认为还有很重要的一个能力,就是解决实际场景当中的思路和方法,对业务和场景的理解是十分重要的。但这个往往说起来十分虚,只有在面试当中,你才会感觉到这方面认识是多么缺乏。
实际上来说对于公司来说,你的代码写的好不好,并不是他最关心的,一个公司要生存,最关心的应该是业务发展,你的工作能够对公司的发展,对它的盈利能够起到多大的支持作用。那么我们要怎么样才能理解业务呢?
我认为,这刚好要从问题的另外一个方向思考,就是:
如果你不会编程的话,那你怎么样去解决这个问题?也就是说不靠一些复杂高级的编程工具,如果你这是在真实场景下,作为一个其他业务线上的人,要直接去为公司盈利,你要怎么样去解决这个问题?
举个例子就是在真实场景中很多特征的处理,并没有办法简单调用已有的工具包直接nltk分词,词根化,把它转化成向量。往往在真实场景当中,特征都是十分复杂的,都是需要人去进行一些很多手工的一些操作,要写一些非常接地气的代码,去解决最实际的问题。那么这些工作未必就是低效的,而是为了得到很好的预测效果,必须要付出的劳动。
这也是奥卡姆剃刀的原理,也就是说在尽可能的程度上进行简化,直到不能简化为止。
但是关键不在于简化,关键在于不能过度简化,牺牲掉最后的效果
。
很多工作,到最后你可能只是需要把这个事情的流程弄得越来越明确,越来越少的模糊的存在空间,越来越把各种复杂的东西都封装在一个简单的容器里面,使其调用起来,使用起来十分的方便,人性化舒适。
这可能才是工作不断提升价值的本质。